{"id":20082205,"url":"https://github.com/exercism/common-lisp","last_synced_at":"2025-10-26T23:48:06.053Z","repository":{"id":14560514,"uuid":"17276251","full_name":"exercism/common-lisp","owner":"exercism","description":"Exercism exercises in Common Lisp.","archived":false,"fork":false,"pushed_at":"2025-07-13T15:40:09.000Z","size":1906,"stargazers_count":89,"open_issues_count":8,"forks_count":83,"subscribers_count":18,"default_branch":"main","last_synced_at":"2025-08-20T15:41:39.169Z","etag":null,"topics":["community-contributions-paused","exercism-track","lisp","maintained-solitary"],"latest_commit_sha":null,"homepage":"https://exercism.org/tracks/common-lisp","language":"Common Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/exercism.png","metadata":{"funding":{"github":["exercism"],"custom":["https://exercism.org/donate"]},"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2014-02-28T05:29:55.000Z","updated_at":"2025-07-13T15:40:11.000Z","dependencies_parsed_at":"2023-02-18T21:01:07.013Z","dependency_job_id":"e5325526-60d4-44c8-b5f4-3a9a1ae03438","html_url":"https://github.com/exercism/common-lisp","commit_stats":{"total_commits":946,"total_committers":81,"mean_commits":"11.679012345679013","dds":0.4799154334038055,"last_synced_commit":"e815b408bbe1abbde92c0932fb021998fdd543d2"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/exercism/common-lisp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exercism%2Fcommon-lisp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exercism%2Fcommon-lisp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exercism%2Fcommon-lisp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exercism%2Fcommon-lisp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/exercism","download_url":"https://codeload.github.com/exercism/common-lisp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exercism%2Fcommon-lisp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273431287,"owners_count":25104491,"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","status":"online","status_checked_at":"2025-09-03T02:00:09.631Z","response_time":76,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["community-contributions-paused","exercism-track","lisp","maintained-solitary"],"created_at":"2024-11-13T15:42:24.425Z","updated_at":"2025-10-26T23:48:01.014Z","avatar_url":"https://github.com/exercism.png","language":"Common Lisp","funding_links":["https://github.com/sponsors/exercism","https://exercism.org/donate"],"categories":[],"sub_categories":[],"readme":"# Exercism Common Lisp Track\n[![Configlet](https://github.com/exercism/common-lisp/actions/workflows/configlet.yml/badge.svg)](https://github.com/exercism/common-lisp/actions/workflows/configlet.yml)\n[![Config Check Status](https://github.com/exercism/common-lisp/workflows/Config%20Check/badge.svg)](https://github.com/exercism/common-lisp/workflows/Config%20Check/badge.svg)\n[![Exercise Test Status](https://github.com/exercism/common-lisp/workflows/Test%20Exercises/badge.svg)](https://github.com/exercism/common-lisp/workflows/Test%20Exercises/badge.svg)\n\nExercism exercises in [Common Lisp][common-lisp].\n\n## Contributing to the Common Lisp Track\n\nThere are several ways to contribute to the Common Lisp track including (but not limited to):\n\n- Reporting problems with the track.\n- Working on the [test runner][common-lisp-test-runner].\n- Working on the [representer][common-lisp-representer].\n- Working on the [analyzer][common-lisp-analyzer].\n- Working on concept exercises.\n- Working on practice exercises.\n- Working on track documents.\n\nThere are two guides to the structure of the track and tooling which would be good to be familiar with.\n\n* The [language track guide][language-track-guide].\nThis describes how all the language tracks are put together, as well\nas details about the common metadata.\n\n* The [track tooling guide][track-tooling-guide].\nThis describes the interface to the various tooling (test runner, representer and analyzer) as well as how they are used and invoked.\n\n### Issues\n\nFeel free to file an issues on the [track repository][track-issues] for problems of any size.\nFeel free to report typographical errors or poor wording for example.\nYou can greatly help improve the quality of the exercises by filing reports of invalid solutions that pass tests or of valid solutions that fail tests.\n\nFor issues specifically with [the analyzer][common-lisp-analyzer], [the representer][common-lisp-representer], or [the test runner][common-lisp-test-runner] please file the issues in the appropriate repository.\n\n### Pull Requests\n\nFeel free to submit [pull requests][track-pulls] to correct any [issues][track-issues] or to add new functionality.\n\nFor pull requests specifically with [the analyzer][common-lisp-analyzer], [the representer][common-lisp-representer], or [the test runner][common-lisp-test-runner] please file the pull requests in the appropriate repository.\n\nPull Requests should be focused on a single change.\nThey must pass the CI system before they will be merged.\n\n### Creating or Modifying Exercises\n\nThere are two types of exercises: concept and practice.\n\nConcept exercises are intended to teach the student a particular concept of the language.\nThey should be simple and short.\nRefer to the document on the [anatomy of a concept exercises][concept-exercise] for details of the parts that are needed for a concept exercises.\nThe work needed for a concept exercise can be large, feel free to create an [issue][track-issues] or [pull request][track-pulls] to discuss ideas for a concept exercise so it can be worked on collaboratively.\n\nPractice exercises are intended to allow a student to further practice and extend their knowledge of a concept.\nThey can be longer and/or more 'clever'.\nRefer to the document on the [anatomy of a practice exercise][practice-exercise] for details of the parts that are needed for a concept exercise.\n\n#### Practice Exercise Generation\n\nMany practice exercises are part of a canonical set of exercises shared across tracks (information on this can be found in the [problem specifications repository][problem-specs].\nThere is a generator in the ./bin folder that you can use to generate all of the requisite files from the problem-specifications.\n(Note, you _will_ need to have cloned the [problem specifications repository][problem-specs] for the generator to work.)\nThe generator is written in Python, and you will therefore need to have Python 3.8 or later installed.\nYou can run the script directly and follow the prompts, or you can run it from the command line.\nIf you wish to run the generator from the command line, first navigate to your common-lisp repository.\nFrom here, there are two ways to run the generator, the first way being to enter the following:\n\n```sh\npython ./bin/lisp_exercise_generator.py\n```\n\nand from there, follow the prompts.\nThe second way is to type in:\n\n```sh\npython ./bin/lisp_exercise_generator.py [-f] [path exercise author]\n```\n\nwhere:\n- path is the relative or absolute path to your problem-specifications repository\n- exercise is the name of the exercise to be generated\n- author is your Github handle\n- -f is a flag to force overwrite an already existing exercise\n\nAny one of these methods will generate and fill in all the necessary files, with the exception of the .meta/example.lisp file, which you will need to complete yourself.\n**The common-lisp/config.json file will remain unaltered - you will have to manually alter this file.**\n\nA Common Lisp replacement for this generator will be coming \"soon\".\n\n## Development Setup\n\nThis track uses [SBCL][sbcl] for its development.\nSince Common Lisp is a standardized language and (at present) exercises only use features and behavior specified by the standard any other conforming implementation could be used for development of features for the track.\nHowever any tooling created for this track (such as part of its build system) must work in [SBCL][sbcl].\nIt is outside the scope of this document to describe how to install a Common Lisp implementation.\nPlease refer to the documentation for your chosen implementation for details.\n\nThe track also uses [QuickLisp][quicklisp] for system management.\nPlease refer to its documentation for instructions on how to install it.\n\n### A note about QuickLisp \u0026 ASDF registries\n\nThe track contains some tools useful during development such as CI tasks.\nThese are provided as [ASDF][asdf] systems.\nTo ensure they are found appropriately by [QuickLisp][quicklisp] and [ASDF][asdf] either symbolic-link them into your `quickslip/local-projects` directory or by configuring your [ASDF registry][asdf-registry-config] appropriately.\n\n### A note about markdown files\n\nSome exercises have a `introduction.md.tpl` file - this means that exercise's `introduction.md` file is not meant to be edited by hand, instead it is generated by combining other documents.\nTo update the `introduction.md` files one must run `./bin/configlet generate`.\n\n## Track Build System\n\nThis track uses [GitHub Actions][github-actions] as a build system.\n\nIt contains several workflows:\n\n* [`configlet.yml`][workflow-configlet] - runs [`configlet`][configlet] to do a general track structure check.\n* [`config-checker.yml`][workflow-config-checker] - runs the [`config-checker` system][config-checker-system] to do some other specific track structure checks.\n* [`test-exercises.yml`][workflow-text-exercises] - runs the [`test-execise` system][test-exercise-system] to run all exercise tests against the example/exemplar files to verify validity of the solutions.\n\n### Building \u0026 Testing\n\nTo run the build \"manually\" execute the following from the root directory of the track:\n\n* In the shell: `./bin/fetch-configlet \u0026\u0026 ./configlet lint`\n* In the REPL: `(progn (asdf:load-system \"config-checker\") (config-checker:check-config))`\n* In the REPL: `(asdf:test-system \"test-exercises\")`\n\n[asdf-registry-config]: https://common-lisp.net/project/asdf/asdf/Configuring-ASDF-to-find-your-systems.html\n[asdf]: https://common-lisp.net/project/asdf/\n[common-lisp-analyzer]: https://github.com/exercism/common-lisp-analyzer\n[common-lisp-representer]: https://github.com/exercism/common-lisp-representer\n[common-lisp-test-runner]: https://github.com/exercism/common-lisp-test-runner\n[common-lisp]: https://common-lisp.net\n[concept-exercise]: https://github.com/exercism/docs/blob/main/building/tracks/concept-exercises.md\n[config-checker-system]: https://github.com/exercism/common-lisp/blob/main/src/config-checker.asd\n[configlet]: https://github.com/exercism/configlet\n[github-actions]: https://github.com/features/actions\n[language-track-guide]: https://github.com/exercism/docs/tree/main/building/tracks\n[practice-exercise]: https://github.com/exercism/docs/blob/main/building/tracks/practice-exercises.md\n[problem-specs]: https://github.com/exercism/problem-specifications/\n[quicklisp]: https://www.quicklisp.org/beta/\n[sbcl]: http://www.sbcl.org\n[test-exercise-system]: https://github.com/exercism/common-lisp/blob/main/src/test-exercises.asd\n[track-issues]: https://github.com/exercism/common-lisp/issues\n[track-pulls]: https://github.com/exercism/common-lisp/pulls\n[track-tooling-guide]: https://github.com/exercism/docs/tree/main/building/tooling\n[workflow-config-checker]: https://github.com/exercism/common-lisp/blob/main/.github/workflows/config-checker.yml\n[workflow-configlet]: https://github.com/exercism/common-lisp/blob/main/.github/workflows/configlet.yml\n[workflow-text-exercises]: https://github.com/exercism/common-lisp/blob/main/.github/workflows/test-exercises.yml\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexercism%2Fcommon-lisp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fexercism%2Fcommon-lisp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexercism%2Fcommon-lisp/lists"}