{"id":18855014,"url":"https://github.com/roman01la/clojurescript-workshop","last_synced_at":"2026-03-09T03:35:30.742Z","repository":{"id":71946372,"uuid":"72355284","full_name":"roman01la/clojurescript-workshop","owner":"roman01la","description":"Repository of related materials to the workshop","archived":false,"fork":false,"pushed_at":"2016-12-11T12:52:45.000Z","size":233,"stargazers_count":36,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2026-01-19T08:29:05.803Z","etag":null,"topics":["clojure","clojurescript","workshop"],"latest_commit_sha":null,"homepage":"https://roman01la.github.io/clojurescript-workshop/","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/roman01la.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2016-10-30T14:46:19.000Z","updated_at":"2024-05-31T07:56:37.000Z","dependencies_parsed_at":null,"dependency_job_id":"a8ace21a-71ed-432c-b69b-070d4f6a178e","html_url":"https://github.com/roman01la/clojurescript-workshop","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/roman01la/clojurescript-workshop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roman01la%2Fclojurescript-workshop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roman01la%2Fclojurescript-workshop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roman01la%2Fclojurescript-workshop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roman01la%2Fclojurescript-workshop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/roman01la","download_url":"https://codeload.github.com/roman01la/clojurescript-workshop/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roman01la%2Fclojurescript-workshop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30281591,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-09T02:57:19.223Z","status":"ssl_error","status_checked_at":"2026-03-09T02:56:26.373Z","response_time":61,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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","clojurescript","workshop"],"created_at":"2024-11-08T03:52:30.345Z","updated_at":"2026-03-09T03:35:30.712Z","avatar_url":"https://github.com/roman01la.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ClojureScript Workshop\n\nRepository of related materials to the workshop\n\n[![Join the chat at https://gitter.im/roman01la/clojurescript-workshop](https://badges.gitter.im/roman01la/clojurescript-workshop.svg)](https://gitter.im/roman01la/clojurescript-workshop)\n\n[📺 Screencast (RU)](https://www.youtube.com/playlist?list=PLHOTezm7WWknZXg8IrRSRLZ-nIlpYUAyU)\n\n## Table of contents\n\n- [Why Lisp?](#why-lisp)\n- [Requirements](#requirements)\n- [Preparation](#preparation)\n- [Links](#links)\n- [Books](#books)\n- [Job Boards](#job-boards)\n\n## Why Lisp?\n\n- **Ex­pres­sive­ness** — when a language allows you to put *more meaning with less code*. It is not just about con­ci­sion, but also *pre­ci­sion*, *read­abil­ity*, *flex­i­bil­ity* and *po­ten­tial for abstraction*.\n- **Everything is an expression**. Most languages has both *statements* and *expressions*, which you can not really combine together, but in Lisp everything is an expression. A single uniform interface allows to compose everything naturally. Take for example Lego blocks: you can build whatever you want easily because those blocks are following the same rule of composition.\n- **An ex­pres­sion is ei­ther a sin­gle value or a list**. There are single values like strings and numbers. But function calls and list data structure are all lists. So basically the whole point of writing a Lisp program is to combine together lists of lists and single values. This gives the same power of composition similar to expressions.\n- **Func­tional pro­gram­ming**. Lisps are considered to be functional languages (there are also OOP capabilities). It means they are focused on avoiding data mutation and state. This allows developers to build truly reusable components and structure programs in a clean way. You can see that all new programming languages are mostly functional, so we can say that functional programming style has proved to be a good tool when building software.\n\n*The list above is inspired by an article [“Why Racket? Why Lisp?”](http://practicaltypography.com/why-racket-why-lisp.html).*\n\n## Requirements\n\nIt's nice to know the following...\n\n- *React.js* library ([learn](http://blog.andrewray.me/reactjs-for-stupid-people/))\n- State management solutions like *Flux* ([learn](http://blog.andrewray.me/flux-for-stupid-people/))\n- A concept of *immutability* ([learn](https://miles.no/blogg/why-care-about-functional-programming-part-1-immutability))\n- Basics of *functional programming* ([learn](http://www.slideshare.net/velvetflair/functional-programming-fundamentals))\n\n## Preparation\n\nYou have to be prepared for the workshop, so we don't have to waste time for this.\n\n### Java\n\nMake sure you have [Java](http://www.oracle.com/technetwork/java/javase/downloads/index.html) 1.6 or greater.\n\n### Leiningen\n\nInstall via *Homebrew*: `brew install leiningen` or [other package managers](https://github.com/technomancy/leiningen/wiki/Packaging).\n\nOr using shell script:\n\n1. Download the [lein script](https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein) (or on Windows [lein.bat](https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein.bat))\n2. Place it on your `$PATH` where your shell can find it (eg. `~/bin`)\n3. Set it to be executable (`chmod a+x ~/bin/lein`)\n4. Run it (`lein`) and it will download the self-install package\n\nOr with [Windows installer](http://leiningen-win-installer.djpowell.net/).\n\n### Readline wrapper\n\n`brew install rlwrap`\n\n*or*\n\n1. Clone the repo: https://github.com/hanslub42/rlwrap\n2. Execute\n\n```\n./configure\nmake\nmake install\n```\n\n### ClojureScript REPL\n\nInstall [Lumo](https://github.com/anmonteiro/lumo/)\n\nvia *NPM*\n```\nnpm i -g lumo-cljs\n```\n\nvia *Homebrew*\n```\nbrew install lumo\n```\n\n### Configure your editor\n\n#### Atom\n\nFollow [this manual](https://gist.github.com/jasongilman/d1f70507bed021b48625). You don't have to install and configure everything, the important parts are: [Parinfer](https://github.com/oakmac/atom-parinfer) plugin, [language-clojure](https://gist.github.com/jasongilman/d1f70507bed021b48625#language-clojure) settings, [lisp-paredit](https://gist.github.com/jasongilman/d1f70507bed021b48625#lisp-paredit) settings and [Atom Settings](https://gist.github.com/jasongilman/d1f70507bed021b48625#atom-settings) sections.\n\n#### Sublime Text\n\n- [sublime-lispindent](https://github.com/odyssomay/sublime-lispindent)\n- [sublime-text-parinfer](https://github.com/oakmac/sublime-text-parinfer)\n\n#### VS Code\n\n- [vscode-parinfer](https://github.com/narma/vscode-parinfer)\n\n#### Vim\n\n- [vim-parinfer](https://github.com/bhurlow/vim-parinfer)\n- [vim-fireplace](https://github.com/tpope/vim-fireplace)\n\n## Links\n\n- [Community Resources](http://clojure.org/community/resources)\n- [ClojureScript REPL](http://jaredforsyth.com/reepl/)\n- [ClojureScript Synonyms](https://kanaka.github.io/clojurescript/web/synonym.html)\n- [ClojureScript Cheatsheet](http://cljs.info/cheatsheet/)\n- [ClojureScript API](http://cljs.github.io/api/)\n- [ClojureDocs](https://clojuredocs.org/)\n- [The Clojure Style Guide](https://github.com/bbatsov/clojure-style-guide)\n- [Quickref for Clojure Core](https://clojuredocs.org/quickref)\n- [ClojureScript Tutorial](https://www.niwi.nz/cljs-workshop/)\n- [ClojureScript Koans](http://clojurescriptkoans.com/)\n- [Video course (RU)](https://www.youtube.com/playlist?list=PLHOTezm7WWkmk_NxC51xwnC2YsAut_5vX)\n- [re-frame](https://github.com/Day8/re-frame)\n- [Clojure Jobs](https://purelyfunctional.tv/resources/clojure-jobs-resources/)\n\n## Books\n- [ClojureScript Unraveled](https://funcool.github.io/clojurescript-unraveled/)\n- [ClojureScript: Up and Running](http://shop.oreilly.com/product/0636920025139.do)\n- [Clojure for the Brave and True](http://www.braveclojure.com/)\n- [Casting SPELs in Lisp](http://www.lisperati.com/casting.html)\n- [Land of Lisp](http://landoflisp.com/)\n- [The Little Schemer](https://mitpress.mit.edu/books/little-schemer)\n- [The Seasoned Schemer](https://mitpress.mit.edu/books/seasoned-schemer)\n\n## Job Boards\n- [jobs.braveclojure.com](https://jobs.braveclojure.com/)\n- [jobs.functionalworks.com](https://jobs.functionalworks.com/)\n- [functionaljobs.com](https://functionaljobs.com/)\n- [remoteok.io/remote-clojure-jobs](https://remoteok.io/remote-clojure-jobs)\n- [More Clojure job resources](https://purelyfunctional.tv/resources/clojure-jobs-resources/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froman01la%2Fclojurescript-workshop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Froman01la%2Fclojurescript-workshop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froman01la%2Fclojurescript-workshop/lists"}