{"id":38054209,"url":"https://github.com/40ants/routes","last_synced_at":"2026-01-16T20:21:43.815Z","repository":{"id":286351978,"uuid":"961153222","full_name":"40ants/routes","owner":"40ants","description":"Framework agnostic URL routing library.","archived":false,"fork":false,"pushed_at":"2025-05-11T22:21:26.000Z","size":282,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-11T23:21:46.998Z","etag":null,"topics":["common-lisp","routing","web"],"latest_commit_sha":null,"homepage":"http://40ants.com/routes/","language":"Common Lisp","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/40ants.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog.md","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,"zenodo":null}},"created_at":"2025-04-05T21:43:17.000Z","updated_at":"2025-05-11T22:21:29.000Z","dependencies_parsed_at":"2025-05-01T19:31:45.384Z","dependency_job_id":"74e7f6ae-ee0f-4e11-af61-e476ad10c8ee","html_url":"https://github.com/40ants/routes","commit_stats":null,"previous_names":["40ants/routes"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/40ants/routes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/40ants%2Froutes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/40ants%2Froutes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/40ants%2Froutes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/40ants%2Froutes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/40ants","download_url":"https://codeload.github.com/40ants/routes/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/40ants%2Froutes/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28482267,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"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":["common-lisp","routing","web"],"created_at":"2026-01-16T20:21:42.099Z","updated_at":"2026-01-16T20:21:43.773Z","avatar_url":"https://github.com/40ants.png","language":"Common Lisp","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-40README-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n# 40ants-routes - Framework agnostic URL routing library\n\n\u003ca id=\"40-ants-routes-asdf-system-details\"\u003e\u003c/a\u003e\n\n## 40ANTS-ROUTES ASDF System Details\n\n* Description: Framework agnostic `URL` routing library.\n* Licence: Unlicense\n* Author: Alexander Artemenko \u003csvetlyak.40wt@gmail.com\u003e\n* Homepage: [https://40ants.com/routes][7261]\n* Bug tracker: [https://github.com/40ants/routes/issues][54bf]\n* Source control: [GIT][6959]\n* Depends on: [alexandria][8236], [cl-ppcre][49b9], [serapeum][c41d], [split-sequence][3dcd], [str][ef7f]\n\n\u003ca id=\"overview\"\u003e\u003c/a\u003e\n\n## Overview\n\n40ants-routes is a framework-agnostic `URL` routing library for Common Lisp, inspired by Django's `URL` routing system. It provides a clean and flexible way to define `URL` routes, generate `URL`s, and handle `URL` parameters.\n\n\u003ca id=\"features\"\u003e\u003c/a\u003e\n\n## Features\n\n* Defining routes with namespaces.\n* Including routes from libraries into applications.\n* Matching `URL` while extracting parameters from it.\n* Generating `URL`s based on route names.\n* Generating breadcrumbs.\n\n\u003ca id=\"installation\"\u003e\u003c/a\u003e\n\n## Installation\n\n```lisp\n(ql:quickload :40ants-routes)\n```\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-40USAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n## Usage Examples\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-40DEFINING-ROUTES-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### Defining Routes\n\nRoutes can be defined using the [`40ants-routes/defroutes:defroutes`][3455] macro.\n\nInside it's body, use [`40ants-routes/defroutes:get`][f902], [`40ants-routes/defroutes:post`][a861], macro\nto define final routes in the collection.\n\n```\n\n(uiop:define-package #:test-routes\n  (:use #:cl)\n  (:shadowing-import-from #:40ants-routes/defroutes\n                          #:defroutes\n                          #:include\n                          #:get\n                          #:post)\n  (:import-from #:40ants-routes/route-url\n                #:route-url)\n  (:import-from #:40ants-routes/handler\n                #:call-handler)\n  (:import-from #:40ants-routes/with-url\n                #:with-partially-matched-url\n                #:with-url))\n(in-package #:test-routes)\n\n(defroutes (*blog-routes* :namespace \"blog\")\n  (get (\"/\" :name \"index\")\n       (format t \"Handler for blog index was called.\"))\n  (get (\"/\u003cstring:slug\u003e\" :name \"post\")\n       (format t \"Handler for blog post ~S was called.\"\n               slug)))\n```\nRoutes, defined by this [`40ants-routes/defroutes:defroutes`][3455] are stored in `*blog-routes*` variable\nand can be used either to [`40ants-routes/defroutes:include`][2897] these routes into the route hierarchy,\nor to search a route, matched to the `URL`. See section [`Matching the URL`][af0d].\n\nHere's an example demonstrating how to use an integer `URL` parameter:\n\n```lisp\n(defroutes (*article-routes* :namespace \"articles\")\n  (get (\"/\" :name \"index\")\n       (format t \"Handler for articles index was called.\"))\n  (get (\"/\u003cint:id\u003e\" :name \"article\")\n       (format t \"Handler for article with ID ~D was called.\"\n               id)))\n```\nIn this example, the route will match `URL`s like `/123` and the argument `ID` will be parsed as an integer.\n\nYou can also capture the rest of the `URL` as a parameter using the `.*` regex pattern:\n\n```lisp\n(defroutes (*file-routes* :namespace \"files\")\n  (get (\"/\" :name \"index\")\n       (format t \"Handler for files index was called.\"))\n  (get (\"/\u003c.*:path\u003e\" :name \"file\")\n       (format t \"Handler for file at path ~S was called.\"\n               path)))\n```\nThis will match `URL`s like `/documents/reports/annual/2023.pdf` and capture the entire path\n`documents/reports/annual/2023.pdf` as the `PATH` argument.\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-40INCLUDING-ROUTES-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### Including Routes\n\nRoutes from libraries can be included in application routes using\n[`40ants-routes/defroutes:include`][2897] function.\n\nThis way they can form a hyerarchy:\n\n```lisp\n(defroutes (*app-routes* :namespace \"app\")\n  (get (\"/\" :name \"index\")\n       (format t \"Handler for application's index page.\"))\n  (include *blog-routes*\n           :path \"/blog/\"))\n```\nIn it's turn, `*blog-routes*` might also include other routes itself.\n\nThis allows to build a composable web-applications and libraries. For example,\nsome library might build routes to show the list of objects, show details about an object,\nedit it and delete. Then such routes can be included into a more complex application.\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-40MATCHING-THE-URL-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### Matching the URL\n\nImagine, user have opened the `URL` with a path like this `/blog/some-post`.\n\nThen in your web-application you might setup the context in which this route\nprocessing should happen. Use [`40ants-routes/with-url:with-url`][1c5e] or [`40ants-routes/with-url:with-partially-matched-url`][1a23]\nmacros to setup the context. Inside the context you can use [`call-handler`][e530] function to call\na body of the route, matched to the `URL`:\n\n```lisp\n\nTEST-ROUTES\u003e (with-url (*app-routes* \"/blog/some-post\")\n               (call-handler))\nHandler for blog post \"some-post\" was called.\n\nTEST-ROUTES\u003e (with-url (*app-routes* \"/blog/\")\n               (call-handler))\nHandler for blog index was called.\n\nTEST-ROUTES\u003e (with-url (*app-routes* \"/\")\n               (call-handler))\nHandler for application's index page.\n```\n[`40ants-routes/with-url:with-url`][1c5e] will signal [`40ants-routes/errors:no-route-for-url-error`][2977]\nerror if there is no route matching the whole `URL`, but [`40ants-routes/with-url:with-partially-matched-url`][1a23] will\ntry to do the best it can.\n\nSo, inside the [`40ants-routes/with-url:with-url`][1c5e] body you can use [`call-handler`][e530]\nalways, while inside the [`40ants-routes/with-url:with-partially-matched-url`][1a23] macro handler should be called only if\n[`40ants-routes/route:current-route-p`][087c] function returns T.\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-40GENERATING-URLS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### Generating URLs\n\nAnother feature of `40ants-routes` is `URL` generation.\n`URL`s can be generated using the [`40ants-routes/route-url:route-url`][fe8a] function. Like\n[`call-handler`][e530], it should be called when `URL` context is available.\n\nIn our application routes tree there are two `index` routes, but we can get paths to both of them\nusing namespaces. Route's namespace is defined as a list of names from the root route, given\nto the [`with-url`][1c5e] macro up to the matched route. Each [`defroutes`][3455] form or a call to [`include`][2897] form\ncreate an object having the name. These names are added to the current route's namespace.\n\nImagine we are on the blog-post page and we want to get path to all blog posts. Easiest way\nto do this, is to call [`route-url`][fe8a] function with only route name:\n\n```lisp\nTEST-ROUTES\u003e (with-url (*app-routes* \"/blog/some-post\")\n               (route-url \"index\"))\n\"/blog/\"\n```\nBut this will not work if the user is on the root page:\n\n```lisp\nTEST-ROUTES\u003e (with-url (*app-routes* \"/\")\n               (route-url \"index\"))\n\"/\"\n```\nYou might want to make `URL` resolution more stable, especially if these `URL`s are used in some common\npage parts such as header or footer. In this case, help `URL` resolver by giving it a namespace:\n\n```lisp\nTEST-ROUTES\u003e (with-url (*app-routes* \"/\")\n               (route-url \"index\"\n                          :namespace '(\"app\" \"blog\")))\n\"/blog/\"\n```\nNote, when you are building a reusable component which creates it's own `40ants-routes/routes:routes` ([`1`][77f9] [`2`][cce3])\nobject, you should not use these absolute namespaces, because you don't know beforehand which namespace\nwill be used by user when including the component's routes.\n\nLet's update our blog component routes and add one to edit the blog post:\n\n```lisp\nTEST-ROUTES\u003e (defroutes (*blog-routes* :namespace \"blog\")\n               (get (\"/\" :name \"index\")\n                 (format t \"Handler for blog index was called.\"))\n               (get (\"/\u003cstring:slug\u003e\" :name \"post\")\n                 (format t \"Handler for blog post ~S was called.~\n                            To edit post go to ~S.\"\n                         slug\n                         (route-url \"edit-post\"\n                                    :slug slug)))\n               (get (\"/\u003cstring:slug\u003e/edit\" :name \"edit-post\")\n                 (format t \"Handler for blog post ~S edit form was called.\"\n                         slug)))\n#\u003c40ANTS-ROUTES/ROUTES:ROUTES \"blog\" 3 subroutes\u003e\n```\nNote, how we did use [`route-url`][fe8a] inside the `/\u003cstring:slug\u003e` handler to get\npath to the post edit page.\n\nNow, let's try to call this handler when this blog's routes are included\ninto the application routes:\n\n```lisp\nTEST-ROUTES\u003e (with-url (*app-routes* \"/blog/some-post\")\n               (call-handler))\nHandler for blog post \"some-post\" was called.To edit post go to \"/blog/some-post/edit\".\n```\nSee, it did return `/blog/some-post/edit` path to the edit page and there wasn't need to specify\na namespace at all!\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-40GENERATING-BREADCRUMBS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### Generating Breadcrumbs\n\nBreadcrumbs can be generated using the [`40ants-routes/breadcrumbs:get-breadcrumbs`][bd21] function. This function returns a list of [`40ants-routes/breadcrumbs:breadcrumb`][e419] objects that represent the path from the root to the current page.\n\nEach [`40ants-routes/breadcrumbs:breadcrumb`][e419] object has the following properties:\n- The `URL` path to the breadcrumb (accessible via [`40ants-routes/breadcrumbs:breadcrumb-path`][3f6e])\n- The display title for the breadcrumb (accessible via [`40ants-routes/breadcrumbs:breadcrumb-title`][b28f])\n- The route object associated with the breadcrumb (accessible via [`40ants-routes/breadcrumbs:breadcrumb-route`][920e])\n\nTo use breadcrumbs, you need to define routes with titles:\n\n```lisp\n\n(defroutes (*admin-users-routes* :namespace \"users\")\n  (post (\"/\" :name \"users\"\n         :title \"Users\")\n    (format nil \"Users list\"))\n  (get (\"/\u003cstring:username\u003e\"\n        :name \"user\"\n        :title \"User Profile\")\n    (format nil \"User profile: ~A\" username)))\n\n\n(defroutes (*admin-routes* :namespace \"admin\")\n  (get (\"/\" :name \"admin-index\" :title \"Admin\")\n    (format nil \"Admin index\"))\n  (include *admin-users-routes*\n           :path \"/users/\"))\n\n\n(defroutes (*app-routes* :namespace \"app\")\n  (get (\"/\" :name \"index\" :title \"Home\")\n    (format nil \"App index\"))\n  (include *admin-routes*\n           :path \"/admin/\"))\n```\nThen, you can generate breadcrumbs for a specific `URL`:\n\n```lisp\n\nTEST-ROUTES\u003e (with-url (*app-routes* \"/admin/users/john\")\n               (let ((crumbs (40ants-routes/breadcrumbs:get-breadcrumbs)))\n                 ;; This way you can get all paths or titles:\n                 (values\n                  (mapcar #'40ants-routes/breadcrumbs:breadcrumb-path crumbs)\n                  (mapcar #'40ants-routes/breadcrumbs:breadcrumb-title crumbs))))\n(\"/\" \"/admin/\" \"/admin/users/\" \"/admin/users/john\")\n(\"Home\" \"Admin\" \"Users\" \"User Profile\")\n```\nor to generate an `HTML` code like this:\n\n```lisp\n\nTEST-ROUTES\u003e (with-url (*app-routes* \"/admin/users/john\")\n               (let ((crumbs (40ants-routes/breadcrumbs:get-breadcrumbs)))\n                 (format t \"\u003cnav aria-label=\\\"breadcrumb\\\"\u003e~%\")\n                 (format t \"  \u003col class=\\\"breadcrumb\\\"\u003e~%\")\n                 (loop for crumb in crumbs\n                       for last-p = (eq crumb (car (last crumbs)))\n                       do (format t \"    \u003cli class=\\\"breadcrumb-item~:[~; active~]\\\"~:[~; aria-current=\\\"page\\\"~]\u003e~%\" \n                                  last-p last-p)\n                          (if last-p\n                              (format t \"      ~A~%\" (40ants-routes/breadcrumbs:breadcrumb-title crumb))\n                              (format t \"      \u003ca href=\\\"~A\\\"\u003e~A\u003c/a\u003e~%\" \n                                      (40ants-routes/breadcrumbs:breadcrumb-path crumb) \n                                      (40ants-routes/breadcrumbs:breadcrumb-title crumb)))\n                          (format t \"    \u003c/li\u003e~%\"))\n                 (format t \"  \u003c/ol\u003e~%\")\n                 (format t \"\u003c/nav\u003e~%\")))\n\u003cnav aria-label=\"breadcrumb\"\u003e\n  \u003col class=\"breadcrumb\"\u003e\n    \u003cli class=\"breadcrumb-item\"\u003e\n      \u003ca href=\"/\"\u003eHome\u003c/a\u003e\n    \u003c/li\u003e\n    \u003cli class=\"breadcrumb-item\"\u003e\n      \u003ca href=\"/admin/\"\u003eAdmin\u003c/a\u003e\n    \u003c/li\u003e\n    \u003cli class=\"breadcrumb-item\"\u003e\n      \u003ca href=\"/admin/users/\"\u003eUsers\u003c/a\u003e\n    \u003c/li\u003e\n    \u003cli class=\"breadcrumb-item active\" aria-current=\"page\"\u003e\n      User Profile\n    \u003c/li\u003e\n  \u003c/ol\u003e\n\u003c/nav\u003e\n```\nFor more advanced usage, you can also use functions as route titles to generate dynamic titles based on `URL` parameters. This is demonstrated in the test file:\n\nFirst, you need to define a function which will accept an arguments extracted from `URL`:\n\n```lisp\n(defun get-user-name (\u0026key username \u0026allow-other-keys)\n  \"A function for retrieving user display names based on username parameter\"\n  (cond\n    ((string= username \"john\")\n     \"John Smith\")\n    ((string= username \"jane\")\n     \"Jane Doe\")\n    (t\n     (format nil \"User: ~A\" username))))\n```\nThen redefine routes, to use this function as `TITLE` argument of the route:\n\n```\n(defroutes (*admin-users-routes* :namespace \"users\")\n  (post (\"/\" :name \"users\" :title \"Users\")\n    (format nil \"Users list\"))\n  (get (\"/\u003cstring:username\u003e\"\n        :name \"user\"\n        ;; Example of using a function for retrieving\n        ;; route title dynamically at runtime:\n        :title #'get-user-name)\n    (format nil \"User profile: ~A\" username)))\n```\nAnd now you will get a real user's name as the last breadcrumb title:\n\n```lisp\n\nTEST-ROUTES\u003e (with-url (*app-routes* \"/admin/users/john\")\n               (let ((crumbs (40ants-routes/breadcrumbs:get-breadcrumbs)))\n                 (values\n                  (mapcar #'40ants-routes/breadcrumbs:breadcrumb-path crumbs)\n                  (mapcar #'40ants-routes/breadcrumbs:breadcrumb-title crumbs))))\n(\"/\" \"/admin/\" \"/admin/users/\" \"/admin/users/john\")\n(\"Home\" \"Admin\" \"Users\" \"John Smith\")\n```\nThis makes it easy to create meaningful breadcrumb navigation that adapts to the content being displayed.\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-40API-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n## API Reference\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FBREADCRUMBS-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-ROUTES/BREADCRUMBS\n\n\u003ca id=\"x-28-23A-28-2825-29-20BASE-CHAR-20-2E-20-2240ANTS-ROUTES-2FBREADCRUMBS-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](80be) `40ants-routes/breadcrumbs`\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FBREADCRUMBS-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FBREADCRUMBS-24BREADCRUMB-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### BREADCRUMB\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FBREADCRUMBS-3ABREADCRUMB-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](6b1c) `40ants-routes/breadcrumbs:breadcrumb` ()\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FBREADCRUMBS-3ABREADCRUMB-PATH-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FBREADCRUMBS-3ABREADCRUMB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](895a) `40ants-routes/breadcrumbs:breadcrumb-path` (breadcrumb) (:path)\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FBREADCRUMBS-3ABREADCRUMB-ROUTE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FBREADCRUMBS-3ABREADCRUMB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](27fe) `40ants-routes/breadcrumbs:breadcrumb-route` (breadcrumb) (:route)\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FBREADCRUMBS-3ABREADCRUMB-TITLE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FBREADCRUMBS-3ABREADCRUMB-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](5dcf) `40ants-routes/breadcrumbs:breadcrumb-title` (breadcrumb) (:title)\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FBREADCRUMBS-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FBREADCRUMBS-3AGET-BREADCRUMBS-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](53c4) `40ants-routes/breadcrumbs:get-breadcrumbs`\n\nGenerate breadcrumbs list for the current `URL` set by [`40ants-routes/with-url:with-url`][1c5e] macro.\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FBREADCRUMBS-3AMAKE-BREADCRUMB-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](dec1) `40ants-routes/breadcrumbs:make-breadcrumb` title\n\nCreates a breadcrumb item.\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FDEFROUTES-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-ROUTES/DEFROUTES\n\n\u003ca id=\"x-28-23A-28-2823-29-20BASE-CHAR-20-2E-20-2240ANTS-ROUTES-2FDEFROUTES-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](31be) `40ants-routes/defroutes`\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FDEFROUTES-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FDEFROUTES-3AINCLUDE-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](c5b9) `40ants-routes/defroutes:include` routes \u0026key (path \"/\")\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FDEFROUTES-3FMacros-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Macros\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FDEFROUTES-3ADEFROUTES-20-2840ANTS-DOC-2FLOCATIVES-3AMACRO-29-29\"\u003e\u003c/a\u003e\n\n##### [macro](f7eb) `40ants-routes/defroutes:defroutes` (var-name \u0026key namespace (routes-class 'routes)) \u0026body route-definitions\n\nDefine a variable holding collection of routes and binds it to a variable `VAR-NAME`.\n\nThis macro acts like a `DEFVAR` - if there is already an `40ants-routes/routes:routes` ([`1`][77f9] [`2`][cce3])\nobject bound to the variable, then it is not replaced, but updated inplace.\nThis allows to change routes on the fly even if they were included into some routes\nhierarchy.\n\nYou can use `ROUTES-CLASS` argument to supply you own class, inherited from `routes` ([`1`][77f9] [`2`][cce3]).\nThis way it might be possible to special processing for these routes, for example,\ninject some special code for representing this routes in the \"breadcrumbs\".\n\nUse [`get`][f902], [`post`][a861], [`put`][c587], `DELETE` macros in `ROUTE-DEFINITIONS` forms.\n\nSee more examples how to define routes in the\n[`Defining Routes`][d39a] section.\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FDEFROUTES-3AGET-20-2840ANTS-DOC-2FLOCATIVES-3AMACRO-29-29\"\u003e\u003c/a\u003e\n\n##### [macro](8a76) `40ants-routes/defroutes:get` (path \u0026key name title (route-class 'route)) \u0026body handler-body\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FDEFROUTES-3APOST-20-2840ANTS-DOC-2FLOCATIVES-3AMACRO-29-29\"\u003e\u003c/a\u003e\n\n##### [macro](bb9a) `40ants-routes/defroutes:post` (path \u0026key name title (route-class 'route)) \u0026body handler-body\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FDEFROUTES-3APUT-20-2840ANTS-DOC-2FLOCATIVES-3AMACRO-29-29\"\u003e\u003c/a\u003e\n\n##### [macro](aba5) `40ants-routes/defroutes:put` (path \u0026key name title (route-class 'route)) \u0026body handler-body\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FERRORS-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-ROUTES/ERRORS\n\n\u003ca id=\"x-28-23A-28-2820-29-20BASE-CHAR-20-2E-20-2240ANTS-ROUTES-2FERRORS-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](2356) `40ants-routes/errors`\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FERRORS-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FERRORS-24ARGUMENT-MISSING-ERROR-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### ARGUMENT-MISSING-ERROR\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3AARGUMENT-MISSING-ERROR-20CONDITION-29\"\u003e\u003c/a\u003e\n\n###### [condition](4f03) `40ants-routes/errors:argument-missing-error` (error)\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3AARGUMENT-MISSING-ERROR-PARAMETER-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FERRORS-3AARGUMENT-MISSING-ERROR-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](4f03) `40ants-routes/errors:argument-missing-error-parameter` (argument-missing-error) (:missing-parameter)\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3AARGUMENT-MISSING-ERROR-ROUTE-NAME-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FERRORS-3AARGUMENT-MISSING-ERROR-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](4f03) `40ants-routes/errors:argument-missing-error-route-name` (argument-missing-error) (:route-name)\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FERRORS-24NAMESPACE-DUPLICATION-ERROR-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### NAMESPACE-DUPLICATION-ERROR\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3ANAMESPACE-DUPLICATION-ERROR-20CONDITION-29\"\u003e\u003c/a\u003e\n\n###### [condition](ac63) `40ants-routes/errors:namespace-duplication-error` (error)\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3AEXISTING-NAMESPACE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FERRORS-3ANAMESPACE-DUPLICATION-ERROR-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](ac63) `40ants-routes/errors:existing-namespace` (namespace-duplication-error) (:namespace)\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3AEXISTING-ROUTE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FERRORS-3ANAMESPACE-DUPLICATION-ERROR-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](ac63) `40ants-routes/errors:existing-route` (namespace-duplication-error) (:existing-route)\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3ANEW-ROUTE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FERRORS-3ANAMESPACE-DUPLICATION-ERROR-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](ac63) `40ants-routes/errors:new-route` (namespace-duplication-error) (:new-route)\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FERRORS-24NO-COMMON-ELEMENTS-ERROR-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### NO-COMMON-ELEMENTS-ERROR\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3ANO-COMMON-ELEMENTS-ERROR-20CONDITION-29\"\u003e\u003c/a\u003e\n\n###### [condition](0a57) `40ants-routes/errors:no-common-elements-error` (error)\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3AFULL-NAMESPACE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FERRORS-3ANO-COMMON-ELEMENTS-ERROR-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](0a57) `40ants-routes/errors:full-namespace` (no-common-elements-error) (:full-namespace)\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3ARELATIVE-NAMESPACE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FERRORS-3ANO-COMMON-ELEMENTS-ERROR-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](0a57) `40ants-routes/errors:relative-namespace` (no-common-elements-error) (:relative-namespace)\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FERRORS-24NO-ROUTE-FOR-URL-ERROR-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### NO-ROUTE-FOR-URL-ERROR\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3ANO-ROUTE-FOR-URL-ERROR-20CONDITION-29\"\u003e\u003c/a\u003e\n\n###### [condition](1b13) `40ants-routes/errors:no-route-for-url-error` (error)\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3AERROR-ROUTES-PATH-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FERRORS-3ANO-ROUTE-FOR-URL-ERROR-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](1b13) `40ants-routes/errors:error-routes-path` (no-route-for-url-error) (:routes-path)\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3AERROR-URL-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FERRORS-3ANO-ROUTE-FOR-URL-ERROR-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](1b13) `40ants-routes/errors:error-url` (no-route-for-url-error) (:url)\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FERRORS-24PATH-DUPLICATION-ERROR-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### PATH-DUPLICATION-ERROR\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3APATH-DUPLICATION-ERROR-20CONDITION-29\"\u003e\u003c/a\u003e\n\n###### [condition](4370) `40ants-routes/errors:path-duplication-error` (error)\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3AEXISTING-PATH-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FERRORS-3APATH-DUPLICATION-ERROR-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](4370) `40ants-routes/errors:existing-path` (path-duplication-error) (:path)\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3AEXISTING-ROUTE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FERRORS-3APATH-DUPLICATION-ERROR-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](4370) `40ants-routes/errors:existing-route` (path-duplication-error) (:existing-route)\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3ANEW-ROUTE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FERRORS-3APATH-DUPLICATION-ERROR-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](4370) `40ants-routes/errors:new-route` (path-duplication-error) (:new-route)\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FERRORS-24URL-RESOLUTION-ERROR-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### URL-RESOLUTION-ERROR\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3AURL-RESOLUTION-ERROR-20CONDITION-29\"\u003e\u003c/a\u003e\n\n###### [condition](8ef4) `40ants-routes/errors:url-resolution-error` (error)\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3ANAMESPACE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FERRORS-3AURL-RESOLUTION-ERROR-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](8ef4) `40ants-routes/errors:namespace` (url-resolution-error) (:namespace)\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FERRORS-3AROUTE-NAME-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FERRORS-3AURL-RESOLUTION-ERROR-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](8ef4) `40ants-routes/errors:route-name` (url-resolution-error) (:route-name)\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FFIND-ROUTE-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-ROUTES/FIND-ROUTE\n\n\u003ca id=\"x-28-23A-28-2824-29-20BASE-CHAR-20-2E-20-2240ANTS-ROUTES-2FFIND-ROUTE-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](b185) `40ants-routes/find-route`\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FFIND-ROUTE-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FFIND-ROUTE-3AFIND-ROUTE-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](3d53) `40ants-routes/find-route:find-route` name \u0026key namespace on-match\n\nFind a route by name in the given namespace hierarchy.\n\nIf route was found, then returns it.\n\nAdditionally, it will call `ON-MATCH` callable argument\nwith each route node along path to the leaf route.\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FGENERICS-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-ROUTES/GENERICS\n\n\u003ca id=\"x-28-23A-28-2822-29-20BASE-CHAR-20-2E-20-2240ANTS-ROUTES-2FGENERICS-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](7799) `40ants-routes/generics`\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FGENERICS-3FGenerics-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Generics\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FGENERICS-3AADD-ROUTE-20GENERIC-FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [generic-function](7fb4) `40ants-routes/generics:add-route` routes route-or-routes-to-add \u0026key override\n\nAdd a route or included-routes object to the routes collection at runtime.\nIf a route with the same path or namespace already exists, an error will be signaled\nunless override is set to true.\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FGENERICS-3AFORMAT-URL-20GENERIC-FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [generic-function](1f44) `40ants-routes/generics:format-url` obj stream args\n\nShould write a piece of `URL` to the `STREAM` substituting arguments from plist `ARGS`.\n\nWhen called, it should write a piece of `URL` without starting backslash.\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FGENERICS-3AGET-ROUTE-BREADCRUMBS-20GENERIC-FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [generic-function](50cd) `40ants-routes/generics:get-route-breadcrumbs` node\n\nReturns a list of breadcrumbs associated with given routes node.\n\n`NODE` argument could have [`40ants-routes/route:route`][377c] class, [`40ants-routes/routes:routes`][cce3] class or an object of other\nclass bound to some object of [`40ants-routes/route:route`][377c] class.\n\nFor objects of class [`40ants-routes/routes:routes`][cce3] usually the method return breadcrumbs of the\nroute having the `/` path.\n\nMethod can return from zero to N objects of [`40ants-routes/breadcrumbs:breadcrumb`][e419] class.\nA returning of multiple breadcrumbs can be useful if route matches to some filename in a nested directory\nand you want to give an ability to navigate into intermediate directories.\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FGENERICS-3AHAS-NAMESPACE-P-20GENERIC-FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [generic-function](5327) `40ants-routes/generics:has-namespace-p` routes\n\nReturns T of node can respond to [`node-namespace`][db92] generic-function call.\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FGENERICS-3AMATCH-URL-20GENERIC-FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [generic-function](640c) `40ants-routes/generics:match-url` obj url \u0026key on-match\n\nChecks for complete match of the object to `URL`.\n\nShould return an `OBJ` if it fully matches to a given url.\nMay return a sub-object if `OBJ` matches to a prefix\nand sub-object matches the rest of `URL`.\n\nIf match was found, the second returned value\nshould be a alist with matched parameters.\n\nIf `ON-MATCH` argument is given, then in any case\nof match, full or prefix, calls `ON-MATCH`\nfunction with `OBJ` as a single argument.\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FGENERICS-3ANODE-NAMESPACE-20GENERIC-FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [generic-function](222b) `40ants-routes/generics:node-namespace` routes\n\nReturns a string name of node's namepace. Works only for objects for which [`has-namespace-p`][3eec] returns true.\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FGENERICS-3APARTIAL-MATCH-URL-20GENERIC-FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [generic-function](b135) `40ants-routes/generics:partial-match-url` obj url\n\nTests of obj matches to the a prefix of `URL`.\n\nIf match was found, should return two\nvalues: the object which matches and position of\nthe character after the matched prefix.\n\nIf `OBJ` is a compound element, then\na sub-element can be returned in case of match.\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FGENERICS-3AURL-PATH-20GENERIC-FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [generic-function](45ef) `40ants-routes/generics:url-path` obj\n\nReturns the [`40ants-routes/url-pattern:url-pattern`][a13f] associated with the object.\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FHANDLER-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-ROUTES/HANDLER\n\n\u003ca id=\"x-28-23A-28-2821-29-20BASE-CHAR-20-2E-20-2240ANTS-ROUTES-2FHANDLER-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](01b4) `40ants-routes/handler`\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FHANDLER-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FHANDLER-3ACALL-HANDLER-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](4c47) `40ants-routes/handler:call-handler`\n\nCalls a handler of current route.\n\nShould be called only during [`40ants-routes/with-url:with-url`][1c5e] macro body execution.\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FINCLUDED-ROUTES-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-ROUTES/INCLUDED-ROUTES\n\n\u003ca id=\"x-28-23A-28-2829-29-20BASE-CHAR-20-2E-20-2240ANTS-ROUTES-2FINCLUDED-ROUTES-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](31c6) `40ants-routes/included-routes`\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FINCLUDED-ROUTES-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FINCLUDED-ROUTES-24INCLUDED-ROUTES-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### INCLUDED-ROUTES\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FINCLUDED-ROUTES-3AINCLUDED-ROUTES-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](3ce2) `40ants-routes/included-routes:included-routes` ()\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FINCLUDED-ROUTES-3AORIGINAL-ROUTES-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FINCLUDED-ROUTES-3AINCLUDED-ROUTES-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](b9bd) `40ants-routes/included-routes:original-routes` (included-routes) (:original-collection)\n\nThe original collection that was included\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FGENERICS-3AURL-PATH-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FINCLUDED-ROUTES-3AINCLUDED-ROUTES-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](43c2) `40ants-routes/generics:url-path` (included-routes) (:path)\n\nPath to add to all routes in the collection\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FINCLUDED-ROUTES-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FINCLUDED-ROUTES-3AINCLUDED-ROUTES-P-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](d0d5) `40ants-routes/included-routes:included-routes-p` obj\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FMATCHED-ROUTE-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-ROUTES/MATCHED-ROUTE\n\n\u003ca id=\"x-28-23A-28-2827-29-20BASE-CHAR-20-2E-20-2240ANTS-ROUTES-2FMATCHED-ROUTE-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](4e55) `40ants-routes/matched-route`\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FMATCHED-ROUTE-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FMATCHED-ROUTE-24MATCHED-ROUTE-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### MATCHED-ROUTE\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FMATCHED-ROUTE-3AMATCHED-ROUTE-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](21dc) `40ants-routes/matched-route:matched-route` ()\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FMATCHED-ROUTE-3AMATCHED-ROUTE-PARAMETERS-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FMATCHED-ROUTE-3AMATCHED-ROUTE-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](40df) `40ants-routes/matched-route:matched-route-parameters` (matched-route) (:parameters = nil)\n\nParameters extracted from the `URL` pattern as alist where keys are parameter names and values - parameter types.\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FMATCHED-ROUTE-3AORIGINAL-ROUTE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FMATCHED-ROUTE-3AMATCHED-ROUTE-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](acf8) `40ants-routes/matched-route:original-route` (matched-route) (:original-route)\n\nThe original [`route`][377c] object which has been matched.\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FMATCHED-ROUTE-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FMATCHED-ROUTE-3AMATCHED-ROUTE-P-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](5224) `40ants-routes/matched-route:matched-route-p` obj\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FROUTE-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-ROUTES/ROUTE\n\n\u003ca id=\"x-28-23A-28-2819-29-20BASE-CHAR-20-2E-20-2240ANTS-ROUTES-2FROUTE-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](a523) `40ants-routes/route`\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FROUTE-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FROUTE-24ROUTE-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### ROUTE\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FROUTE-3AROUTE-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](c40a) `40ants-routes/route:route` ()\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FROUTE-3AROUTE-HANDLER-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FROUTE-3AROUTE-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](e1d4) `40ants-routes/route:route-handler` (route) (:handler)\n\nFunction to handle the route\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FROUTE-3AROUTE-METHOD-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FROUTE-3AROUTE-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](e079) `40ants-routes/route:route-method` (route) (:method = :get)\n\n`HTTP` method (`GET`, `POST`, `PUT`, etc.)\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FROUTE-3AROUTE-NAME-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FROUTE-3AROUTE-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](f77b) `40ants-routes/route:route-name` (route) (:name)\n\nName of the route\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FROUTE-3AROUTE-TITLE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FROUTE-3AROUTE-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](55fc) `40ants-routes/route:route-title` (route) (:title = nil)\n\nTitle for breadcrumbs\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FGENERICS-3AURL-PATH-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FROUTE-3AROUTE-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](8221) `40ants-routes/generics:url-path` (route) (:pattern)\n\n`URL` pattern\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FURL-PATTERN-24URL-PATTERN-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### URL-PATTERN\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](de0b) `40ants-routes/url-pattern:url-pattern` ()\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-PARAMS-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](4cbf) `40ants-routes/url-pattern:url-pattern-params` (url-pattern) (:params)\n\nAlist with parameter types\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-PATTERN-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](8878) `40ants-routes/url-pattern:url-pattern-pattern` (url-pattern) (:pattern)\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-REGEX-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](2180) `40ants-routes/url-pattern:url-pattern-regex` (url-pattern) (:regex)\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FROUTE-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FROUTE-3ACURRENT-ROUTE-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](122f) `40ants-routes/route:current-route`\n\nReturns the current route.\n\nShould be called only during [`40ants-routes/with-url:with-url`][1c5e] macro body execution.\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FROUTE-3ACURRENT-ROUTE-P-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](18bd) `40ants-routes/route:current-route-p`\n\nReturns T if there current route matching the `URL` was found..\n\nShould be called only during [`40ants-routes/with-url:with-url`][1c5e]\nor [`40ants-routes/with-url:with-partially-matched-url`][1a23] macro body execution.\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FROUTE-3AROUTEP-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](9264) `40ants-routes/route:routep` obj\n\nChecks if `OBJ` is of [`route`][377c] class.\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FROUTE-URL-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-ROUTES/ROUTE-URL\n\n\u003ca id=\"x-28-23A-28-2823-29-20BASE-CHAR-20-2E-20-2240ANTS-ROUTES-2FROUTE-URL-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](09bb) `40ants-routes/route-url`\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FROUTE-URL-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FROUTE-URL-3AROUTE-URL-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](61ac) `40ants-routes/route-url:route-url` name \u0026rest args \u0026key namespace \u0026allow-other-keys\n\nGenerate a `URL` for a named route with the given parameters.\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FROUTES-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-ROUTES/ROUTES\n\n\u003ca id=\"x-28-23A-28-2820-29-20BASE-CHAR-20-2E-20-2240ANTS-ROUTES-2FROUTES-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](59ce) `40ants-routes/routes`\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FROUTES-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FROUTES-24ROUTES-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### ROUTES\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FROUTES-3AROUTES-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](52f1) `40ants-routes/routes:routes` ()\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FROUTES-3ACHILDREN-ROUTES-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FROUTES-3AROUTES-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](4441) `40ants-routes/routes:children-routes` (routes) (:children = nil)\n\nList of children in this collection.\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FGENERICS-3ANODE-NAMESPACE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FROUTES-3AROUTES-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](0986) `40ants-routes/generics:node-namespace` (routes) (:namespace)\n\nNamespace of this routes collection.\n\n**Accessors**\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FROUTES-3ACHILDREN-ROUTES-20-2840ANTS-DOC-2FLOCATIVES-3AACCESSOR-2040ANTS-ROUTES-2FROUTES-3AROUTES-29-29\"\u003e\u003c/a\u003e\n\n###### [accessor](4441) `40ants-routes/routes:children-routes` (routes) (:children = nil)\n\nList of children in this collection.\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FGENERICS-3ANODE-NAMESPACE-20-2840ANTS-DOC-2FLOCATIVES-3AACCESSOR-2040ANTS-ROUTES-2FROUTES-3AROUTES-29-29\"\u003e\u003c/a\u003e\n\n###### [accessor](0986) `40ants-routes/generics:node-namespace` (routes) (:namespace)\n\nNamespace of this routes collection.\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FROUTES-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FROUTES-3AROUTESP-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](e475) `40ants-routes/routes:routesp` obj\n\nChecks if object is of class [`routes`][cce3].\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FROUTES-3FMacros-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Macros\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FROUTES-3AROUTES-20-2840ANTS-DOC-2FLOCATIVES-3AMACRO-29-29\"\u003e\u003c/a\u003e\n\n##### [macro](f269) `40ants-routes/routes:routes` (namespace \u0026key (routes-class 'routes)) \u0026body route-definitions\n\nDefine a variable holding collection of routes the same way\nas [`40ants-routes/defroutes:defroutes`][3455] does, but do not bind these routes to the variable.\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FURL-PATTERN-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-ROUTES/URL-PATTERN\n\n\u003ca id=\"x-28-23A-28-2825-29-20BASE-CHAR-20-2E-20-2240ANTS-ROUTES-2FURL-PATTERN-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](9930) `40ants-routes/url-pattern`\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FURL-PATTERN-3FClasses-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Classes\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FURL-PATTERN-24URL-PATTERN-3FCLASS-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n##### URL-PATTERN\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-20CLASS-29\"\u003e\u003c/a\u003e\n\n###### [class](de0b) `40ants-routes/url-pattern:url-pattern` ()\n\n**Readers**\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-PARAMS-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](4cbf) `40ants-routes/url-pattern:url-pattern-params` (url-pattern) (:params)\n\nAlist with parameter types\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-PATTERN-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](8878) `40ants-routes/url-pattern:url-pattern-pattern` (url-pattern) (:pattern)\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-REGEX-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-29-29\"\u003e\u003c/a\u003e\n\n###### [reader](2180) `40ants-routes/url-pattern:url-pattern-regex` (url-pattern) (:regex)\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FURL-PATTERN-3FFunctions-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Functions\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FURL-PATTERN-3APARSE-URL-PATTERN-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](898a) `40ants-routes/url-pattern:parse-url-pattern` pattern\n\nParse a `URL` pattern and extract parameter specifications.\n\nReturns an object of class [`url-pattern`][a13f].\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-EQUAL-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](9829) `40ants-routes/url-pattern:url-pattern-equal` left right\n\nCompares two [`url-pattern`][a13f] objects\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-P-20FUNCTION-29\"\u003e\u003c/a\u003e\n\n##### [function](6b0c) `40ants-routes/url-pattern:url-pattern-p` obj\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-4040ANTS-ROUTES-2FWITH-URL-3FPACKAGE-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n### 40ANTS-ROUTES/WITH-URL\n\n\u003ca id=\"x-28-23A-28-2822-29-20BASE-CHAR-20-2E-20-2240ANTS-ROUTES-2FWITH-URL-22-29-20PACKAGE-29\"\u003e\u003c/a\u003e\n\n#### [package](983b) `40ants-routes/with-url`\n\n\u003ca id=\"x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-7C-4040ANTS-ROUTES-2FWITH-URL-3FMacros-SECTION-7C-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\"\u003e\u003c/a\u003e\n\n#### Macros\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FWITH-URL-3AWITH-PARTIALLY-MATCHED-URL-20-2840ANTS-DOC-2FLOCATIVES-3AMACRO-29-29\"\u003e\u003c/a\u003e\n\n##### [macro](6cef) `40ants-routes/with-url:with-partially-matched-url` (root-routes url) \u0026body body\n\nExecute body with the current routes object corresponding to a given `URL` argument.\n\nDifference between this macro and [`with-url`][1c5e] macro is that [`with-url`][1c5e] signals an error\nif it is unable to find a leaf route matching to the whole `URL`.\n\n[`with-partially-matched-url`][1a23] will try to find a routes path matching as much\nof `URL` as possible. As the result, [`40ants-routes/route:current-route-p`][087c] function\nmight return `NIL` when `URL` was not fully matched by [`with-partially-matched-url`][1a23].\n\n\u003ca id=\"x-2840ANTS-ROUTES-2FWITH-URL-3AWITH-URL-20-2840ANTS-DOC-2FLOCATIVES-3AMACRO-29-29\"\u003e\u003c/a\u003e\n\n##### [macro](56f3) `40ants-routes/with-url:with-url` (root-routes url) \u0026body body\n\nExecute body with the current routes object corresponding to a given `URL` argument.\n\n\n[7261]: https://40ants.com/routes\n[e419]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FBREADCRUMBS-3ABREADCRUMB-20CLASS-29\n[3f6e]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FBREADCRUMBS-3ABREADCRUMB-PATH-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FBREADCRUMBS-3ABREADCRUMB-29-29\n[920e]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FBREADCRUMBS-3ABREADCRUMB-ROUTE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FBREADCRUMBS-3ABREADCRUMB-29-29\n[b28f]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FBREADCRUMBS-3ABREADCRUMB-TITLE-20-2840ANTS-DOC-2FLOCATIVES-3AREADER-2040ANTS-ROUTES-2FBREADCRUMBS-3ABREADCRUMB-29-29\n[bd21]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FBREADCRUMBS-3AGET-BREADCRUMBS-20FUNCTION-29\n[3455]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FDEFROUTES-3ADEFROUTES-20-2840ANTS-DOC-2FLOCATIVES-3AMACRO-29-29\n[f902]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FDEFROUTES-3AGET-20-2840ANTS-DOC-2FLOCATIVES-3AMACRO-29-29\n[2897]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FDEFROUTES-3AINCLUDE-20FUNCTION-29\n[a861]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FDEFROUTES-3APOST-20-2840ANTS-DOC-2FLOCATIVES-3AMACRO-29-29\n[c587]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FDEFROUTES-3APUT-20-2840ANTS-DOC-2FLOCATIVES-3AMACRO-29-29\n[2977]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FERRORS-3ANO-ROUTE-FOR-URL-ERROR-20CONDITION-29\n[3eec]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FGENERICS-3AHAS-NAMESPACE-P-20GENERIC-FUNCTION-29\n[db92]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FGENERICS-3ANODE-NAMESPACE-20GENERIC-FUNCTION-29\n[e530]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FHANDLER-3ACALL-HANDLER-20FUNCTION-29\n[087c]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FROUTE-3ACURRENT-ROUTE-P-20FUNCTION-29\n[377c]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FROUTE-3AROUTE-20CLASS-29\n[fe8a]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FROUTE-URL-3AROUTE-URL-20FUNCTION-29\n[77f9]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FROUTES-3AROUTES-20-2840ANTS-DOC-2FLOCATIVES-3AMACRO-29-29\n[cce3]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FROUTES-3AROUTES-20CLASS-29\n[a13f]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FURL-PATTERN-3AURL-PATTERN-20CLASS-29\n[1a23]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FWITH-URL-3AWITH-PARTIALLY-MATCHED-URL-20-2840ANTS-DOC-2FLOCATIVES-3AMACRO-29-29\n[1c5e]: https://40ants.com/routes/#x-2840ANTS-ROUTES-2FWITH-URL-3AWITH-URL-20-2840ANTS-DOC-2FLOCATIVES-3AMACRO-29-29\n[d39a]: https://40ants.com/routes/#x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-40DEFINING-ROUTES-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\n[af0d]: https://40ants.com/routes/#x-2840ANTS-ROUTES-DOCS-2FINDEX-3A-3A-40MATCHING-THE-URL-2040ANTS-DOC-2FLOCATIVES-3ASECTION-29\n[6959]: https://github.com/40ants/routes\n[80be]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/breadcrumbs.lisp#L1\n[6b1c]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/breadcrumbs.lisp#L35\n[895a]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/breadcrumbs.lisp#L36\n[5dcf]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/breadcrumbs.lisp#L39\n[27fe]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/breadcrumbs.lisp#L42\n[dec1]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/breadcrumbs.lisp#L84\n[53c4]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/breadcrumbs.lisp#L92\n[31be]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/defroutes.lisp#L1\n[8a76]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/defroutes.lisp#L120\n[bb9a]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/defroutes.lisp#L124\n[aba5]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/defroutes.lisp#L128\n[c5b9]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/defroutes.lisp#L140\n[f7eb]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/defroutes.lisp#L34\n[f269]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/defroutes.lisp#L72\n[2356]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/errors.lisp#L1\n[0a57]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/errors.lisp#L24\n[ac63]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/errors.lisp#L35\n[4370]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/errors.lisp#L49\n[1b13]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/errors.lisp#L63\n[8ef4]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/errors.lisp#L74\n[4f03]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/errors.lisp#L85\n[b185]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/find-route.lisp#L1\n[3d53]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/find-route.lisp#L103\n[7799]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/generics.lisp#L1\n[640c]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/generics.lisp#L14\n[b135]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/generics.lisp#L30\n[1f44]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/generics.lisp#L42\n[45ef]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/generics.lisp#L48\n[5327]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/generics.lisp#L52\n[222b]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/generics.lisp#L58\n[7fb4]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/generics.lisp#L62\n[50cd]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/generics.lisp#L68\n[01b4]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/handler.lisp#L1\n[4c47]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/handler.lisp#L15\n[31c6]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/included-routes.lisp#L1\n[3ce2]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/included-routes.lisp#L20\n[b9bd]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/included-routes.lisp#L21\n[43c2]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/included-routes.lisp#L25\n[d0d5]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/included-routes.lisp#L39\n[4e55]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/matched-route.lisp#L1\n[21dc]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/matched-route.lisp#L22\n[acf8]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/matched-route.lisp#L23\n[40df]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/matched-route.lisp#L27\n[5224]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/matched-route.lisp#L44\n[09bb]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/route-url.lisp#L1\n[61ac]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/route-url.lisp#L27\n[a523]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/route.lisp#L1\n[c40a]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/route.lisp#L32\n[f77b]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/route.lisp#L33\n[8221]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/route.lisp#L37\n[e1d4]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/route.lisp#L41\n[55fc]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/route.lisp#L45\n[e079]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/route.lisp#L50\n[9264]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/route.lisp#L68\n[18bd]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/route.lisp#L80\n[122f]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/route.lisp#L88\n[59ce]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/routes.lisp#L1\n[52f1]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/routes.lisp#L21\n[4441]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/routes.lisp#L22\n[0986]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/routes.lisp#L26\n[e475]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/routes.lisp#L39\n[9930]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/url-pattern.lisp#L1\n[6b0c]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/url-pattern.lisp#L172\n[9829]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/url-pattern.lisp#L179\n[de0b]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/url-pattern.lisp#L24\n[8878]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/url-pattern.lisp#L25\n[2180]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/url-pattern.lisp#L28\n[4cbf]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/url-pattern.lisp#L31\n[898a]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/url-pattern.lisp#L46\n[983b]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/with-url.lisp#L1\n[6cef]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/with-url.lisp#L112\n[56f3]: https://github.com/40ants/routes/blob/b599659e5cbe7655ff69a9d4298359de9ef65acd/src/with-url.lisp#L86\n[54bf]: https://github.com/40ants/routes/issues\n[8236]: https://quickdocs.org/alexandria\n[49b9]: https://quickdocs.org/cl-ppcre\n[c41d]: https://quickdocs.org/serapeum\n[3dcd]: https://quickdocs.org/split-sequence\n[ef7f]: https://quickdocs.org/str\n\n* * *\n###### [generated by [40ANTS-DOC](https://40ants.com/doc/)]\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F40ants%2Froutes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F40ants%2Froutes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F40ants%2Froutes/lists"}