{"id":13781404,"url":"https://github.com/voithos/awl","last_synced_at":"2025-05-02T05:31:32.279Z","repository":{"id":16517746,"uuid":"19270829","full_name":"voithos/awl","owner":"voithos","description":"Experimental Lispy mini-language","archived":false,"fork":false,"pushed_at":"2021-05-02T19:50:04.000Z","size":1083,"stargazers_count":7,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-21T06:11:16.412Z","etag":null,"topics":["awl","emscripten","interpreter","lisp-variant","toy-language"],"latest_commit_sha":null,"homepage":"http://voithos.io/awl","language":"C","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/voithos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"MIT-LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-04-29T09:24:41.000Z","updated_at":"2021-05-02T19:48:08.000Z","dependencies_parsed_at":"2022-09-06T09:51:15.049Z","dependency_job_id":null,"html_url":"https://github.com/voithos/awl","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voithos%2Fawl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voithos%2Fawl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voithos%2Fawl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voithos%2Fawl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/voithos","download_url":"https://codeload.github.com/voithos/awl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251992856,"owners_count":21677021,"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":["awl","emscripten","interpreter","lisp-variant","toy-language"],"created_at":"2024-08-03T18:01:25.688Z","updated_at":"2025-05-02T05:31:27.271Z","avatar_url":"https://github.com/voithos.png","language":"C","funding_links":[],"categories":["C"],"sub_categories":[],"readme":"# Awl\n\n_Lisp_: from late Old English _awlyspian_, meaning \"to lisp.\"\n\n---\n\nAwl is an experimental mini-language based on the Lisp family of programming\nlanguages.\n\n### Synopsis\n\nIt was written for fun and \u003cs\u003eprofit\u003c/s\u003e to learn more about interpreter\ndesign, programming in C, and using\n[emscripten](https://github.com/kripken/emscripten) to transpile to JavaScript.\n\n**Note**: This naturally goes without saying, but Awl is just an experimental\nlearning project, which means that it is lacking in thorough testing and\nprobably has many bugs. It should *not* be used for production code, lest it\nsummon Undefined Behavior\u0026trade; upon you.\n\nThat being said, experimenting and hacking on non-production-ready code just\nfor fun can be worthwhile!\n\n## Examples\n\nHere are a few examples that briefly demonstrate some of Awl's features.\n\nMath:\n\n    ; Math example\n    ;;\n\n    (func (mean l) (/ (sum l) (len l)))\n\n    (func (variance l)\n        (let ((mu (mean l)))\n            (/\n                (sum (map (fn (x) (^ (- x mu) 2)) l))\n                (len l))))\n\n    (define xs {1 2 3 4 5 6})\n    (println (mean xs)) ; prints 3.5\n    (println (variance xs)) ; prints 2.916\n\nRecursion:\n\n    ; Recursive cycle\n    ;;\n\n    (func (cycle xs)\n        (let ((f (fn (n)\n            (let ((i (% n (len xs))))\n                (cons (head (slice xs i (+ i 1)))\n                      (list (fn () (f (+ n 1)))))))))\n            (fn () (f 0))))\n\n    (define xs {1 2 3 4})\n    (println ((cycle xs)))\n    (println ((head (tail ((cycle xs))))))\n\nMergesort:\n\n    ; Merge sort\n    ;;\n\n    (func (merge-sort l)\n        (if (\u003c= (len l) 1)\n            l\n            (let ((middle (// (len l) 2))\n                  (left (slice l 0 middle))\n                  (right (slice l middle))\n                  (left-sorted (merge-sort left))\n                  (right-sorted (merge-sort right)))\n                (merge left-sorted right-sorted))))\n\n    (func (merge l r)\n        (if (nil? l)\n            r\n            (if (nil? r)\n                l\n                (let ((hl (head l))\n                      (hr (head r)))\n                    (if (\u003c hl hr)\n                        (cons hl (merge (tail l) r))\n                        (cons hr (merge l (tail r))))))))\n\n    (println (merge-sort {4 3 2 1}))\n    ; prints -\u003e {1 2 3 4}\n\n    (println (merge-sort {54 83 1274 83 74 218 9}))\n    ; prints -\u003e {9 54 74 83 83 218 1274}\n\n## Compiling\n\nMost of Awl's dependencies are included in the repository, so you shouldn't\nneed to install anything other than the build tools. Awl takes advantage of\nsome new features in `C11`, so you will need a fairly recent C compiler.\n\n- Both `clang` (tested with version 3.5.0) and `gcc` (tested with version\n  4.7.2) are known to successfully compile\n- You'll need `make`\n- To transpile to JavaScript, you'll need the emscripten toolkit, including\n  `emcc`.\n- To minify the output JavaScript from `emscripten`, you'll need `uglifyjs`,\n  but it isn't strictly necessary.\n\nFirst, clone the repository, and then compile using `make`:\n\n    $ git clone https://github.com/voithos/awl.git\n    $ cd awl\n    $ make\n\nThis will create an `awl` binary under `bin/`.\n\nYou can also compile and execute tests:\n\n    $ make test\n\nOr transpile to JavaScript (`emcc` will need to be in your `$PATH`):\n\n    $ make web\n\nClean up if you want to start over:\n\n    $ make clean\n\n## Usage\n\nThe `awl` binary can take a single argument - a path to a file to execute.\n\n    $ ./bin/awl [file]\n\nIf no argument is given, then it will drop into an interactive interpreter\n([REPL](http://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop)):\n\n    $ ./bin/awl\n    awl v0.x.y\n    Ctrl+D to exit\n\n    awl\u003e\n\n## Features\n\nAwl is a mini-language that is inspired by the Lisp family of languages. Thus,\nit shares most of its features with Lisp and Scheme. These include:\n\n- Dynamic typing\n- First-class functions, including [anonymous (lambda)\n  functions](http://en.wikipedia.org/wiki/Anonymous_function)\n- Function\n  [closures](http://en.wikipedia.org/wiki/Closure_(computer_programming))\n- [Partial application](http://en.wikipedia.org/wiki/Partial_application)\n- [Tail-call optimization](http://en.wikipedia.org/wiki/Tail_recursion)\n- Data immutability\n- Lists as the primary data structure\n- [Homoiconicity](http://en.wikipedia.org/wiki/Homoiconicity) - that is,\n  similar representations of code and data\n- Metaprogramming in the form of simple macros\n\nCurrently, Awl's data definition and manipulation capabilities are lacking, but\nthis will hopefully be changed in the future.\n\n## Language Reference\n\nAwl is an expression-based language. Basically everything is an expression, and\ncan be arbitrarily nested. A program consists of a sequence of such\nexpressions.\n\n### Basic Features\n\nAwl supports inline comments using semicolons (`;`):\n\n    ; Can go on its own line\n    (func (plus-one x)\n        (+ x 1)) ; Or at the end of a line\n\nPrinting to standard output can be done using `print` and `println`:\n\n    awl\u003e (println \"Hello sekai!\")\n    Hello sekai!\n\nVariables are created with `define` (which affects the local environment) and\n`global` (which, as the name suggests, affects the global environment):\n\n    awl\u003e (define foo 'bar')\n    awl\u003e (println foo)\n    bar\n\n### Primitive Data Types\n\n\u003ctable\u003e\n\n\u003ccolgroup\u003e\n\u003ccol style=\"width: 15%;\"\u003e\n\u003ccol style=\"width: 35%;\"\u003e\n\u003ccol style=\"width: 50%;\"\u003e\n\u003c/colgroup\u003e\n\n\u003cthead\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eExample\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/thead\u003e\n\n\u003ctbody\u003e\n\n\u003ctr\u003e\n\u003ctd\u003eInteger\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e5\u003c/code\u003e, \u003ccode\u003e-9\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eA standard integer (\u003ccode\u003elong\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003eFloating point\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e-5.\u003c/code\u003e, \u003ccode\u003e3.14\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eA standard floating point (\u003ccode\u003edouble\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003eBoolean\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etrue\u003c/code\u003e, \u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eA standard... boolean\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003eString\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\"\\\"escapes\\\" OK\"\u003c/code\u003e, \u003ccode\u003e'foobar'\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eA string type - either single or double quotes\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003eQ-Symbol\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e:like-in-ruby\u003c/code\u003e, \u003ccode\u003e:'foo'\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eA quoted symbol (identifier), can also be written similar to strings\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003eQ-Expr\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e{1 'b' (+ 1 2) x y}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eA quoted expression. The basic data structure - acts like a list\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003eDictionary\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e[:x 42 :y 'yes' :z {c}]\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eA key-value store. Keys are Q-Symbols, values can be anything\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003eFunction\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(fn (x) (/ 1 x))\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAn anonymous function. The basic mechanism of function definition\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003eError\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(error 'somebody set up us the bomb')\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAn error. Stops evaluation\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/tbody\u003e\n\n\u003c/table\u003e\n\n### Expressions\n\nFunction calls in Awl are defined as\n[S-Expressions](http://en.wikipedia.org/wiki/S_expression) (symbolic\nexpressions). They are syntactically enclosed in parentheses `()`. The first\nargument of the expression must be a callable, and is evaluated in the current\nenvironment with any following arguments as parameters (this is the iconic\n\"[Polish notation](http://en.wikipedia.org/wiki/Polish_notation)\" of Lisp).\n\n    awl\u003e (+ 5 6)\n    11\n    awl\u003e (println 'foo')\n    foo\n\nWhen evaluating user-defined functions, partial application is done\nautomatically for any unfilled arguments (this is currently not done for\nbuiltins).  This makes it easy to use higher-order functions quickly:\n\n    awl\u003e (define xs {1 2 3 4})\n    awl\u003e (define square (map (fn (x) (* x x))))\n    awl\u003e (square xs)\n    {1 4 9 16}\n\nVariable and function identifiers, called \"symbols,\" are evaluated to the\nvalues that they map to, except in certain special forms (e.g. when they are\nbeing defined):\n\n    awl\u003e (define x 5)\n    awl\u003e (+ x 6)\n    11\n\nThe primitive types evaluate to themselves.\n\nQ-Expressions (quoted expressions, often referred to simply as 'lists') are\nparticularly important. They are enclosed inside curly braces `{}`. They are a\ncollection type and behave similar to lists in other languages. They can store\nany number and mixture of primitive types. And they have one more important\nability: expressions that they contain which would normally be evaluated, such\nas symbols and S-Expressions, are left unevaluated (i.e. they are \"quoted\").\nThis allows them to contain arbitrary code, and then be converted and evaluated\nas S-Expressions:\n\n    awl\u003e (head {1 2 3})\n    1\n    awl\u003e (tail {1 2 3})\n    {2 3}\n    awl\u003e (define x {* 3 (+ 2 2)})\n    awl\u003e x\n    {* 3 (+ 2 2)}\n    awl\u003e (eval x)\n    12\n\nThere are a few more expression types that are useful in special cases.\n\nE-Expressions (escaped expressions) are denoted with a preceding backslash `\\`,\nand can be used to specifically evaluate a section within a Q-Expression\nliteral:\n\n    awl\u003e {1 2 (+ 2 1)}\n    {1 2 (+ 2 1)}\n    awl\u003e {1 2 \\(+ 2 1)}\n    {1 2 3}\n\nC-Expressions (concatenating expressions) are denoted with a preceding at-sign\n`@`.  They behave similarly to E-Expressions, with the exception that, when\ngiven a list (Q-Expression), they \"extract\" the contents and include it\ndirectly in the outer list:\n\n    awl\u003e {1 2 \\{3 4}}\n    {1 2 {3 4}}\n    awl\u003e {1 2 @{3 4}}\n    {1 2 3 4}\n\nFinally, there is another collection type that is slightly more mundane than\nQ-Expressions and their ilk: Dictionaries. Dictionaries act as simple key-value\nstores, and are similar to the dictionaries in other languages. They are\ndelimited with square brackets `[]`, use Q-Symbols as their keys, and can store\nany normal value:\n\n    awl\u003e (dict-get [:foo 12 :bar 43] :foo)\n    12\n    awl\u003e (dict-set [:x 1 :y 2] :z 3)\n    [:'x' 1 :'y' 2 :'z' 3]\n\n### Builtins\n\nBuiltins usually behave like normal functions, but they also have the special\nrole of enabling some of Awl's basic features, since they are written in C (for\nexample, the `fn` builtin creates a new anonymous function).\n\nAwl makes no distinction between \"operators\" (`+`, `-`, `*`) and other kinds of\nbuiltins - they are simply named differently.\n\n\u003ctable\u003e\n\n\u003ccolgroup\u003e\n\u003ccol style=\"width: 15%;\"\u003e\n\u003ccol style=\"width: 35%;\"\u003e\n\u003ccol style=\"width: 50%;\"\u003e\n\u003c/colgroup\u003e\n\n\u003cthead\u003e\n\u003cth\u003eBuiltin\u003c/th\u003e\n\u003cth\u003eSignature\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/thead\u003e\n\n\u003ctbody\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e+\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(+ [args...])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAddition. Takes 2 or more arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e-\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(- [args...])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSubtraction. Takes 2 or more arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e*\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(* [args...])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMultiplication. Takes 2 or more arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(/ [args...])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDivision. Promotes integers to floats if necessary. Takes 2 or more arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e//\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(// [args...])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTruncating division. Removes decimal remainder. Takes 2 or more arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e%\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(% [args...])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eModulo. Takes 2 or more arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e^\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(^ [args...])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePower operator. Takes 2 or more arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(\u0026gt; [arg1] [arg2])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGreater than. Takes 2 arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026gt;=\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(\u0026gt;= [arg1] [arg2])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eGreater than or equal to. Takes 2 arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026lt;\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(\u0026lt; [arg1] [arg2])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLess than. Takes 2 arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e\u0026lt;=\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(\u0026lt;= [arg1] [arg2])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLess than or equal to. Takes 2 arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e==\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(== [arg1] [arg2])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEqual to. Tests deep equality. Takes 2 arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003e!=\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(!= [arg1] [arg2])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUnequal to. Tests deep equality. Takes 2 arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eand\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(and [arg1] [arg2])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLogical 'and'. Short circuiting. Takes 2 arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eor\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(or [arg1] [arg2])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLogical 'or'. Short circuiting. Takes 2 arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enot\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(not [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLogical 'not'. Takes 1 argument\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehead\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(head [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns the extracted first element (head) of a list\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eqhead\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(qhead [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLike \u003ccode\u003ehead\u003c/code\u003e, except quotes symbols and S-Exprs\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etail\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(tail [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns the tail of a list, excluding the first element\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efirst\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(first [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSimilar to \u003ccode\u003ehead\u003c/code\u003e, but doesn't extract\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elast\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(last [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns the last element of a list, unextracted\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexcept-last\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(except-last [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns the first section of a list, excluding the last element\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elist\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(list [args...])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns a list containing the evaluated arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eeval\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(eval [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEvaluates a list as if it were an S-Expression\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eappend\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(append [args...])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConcatenates two or more lists\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econs\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(cons [arg1] [arg2])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAttaches a primitive type to the head of a list\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edict-get\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(dict-get [dict] [key])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRetrieves a value from a dict using a key\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edict-set\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(dict-set [dict] [key] [val])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns a new dict with a value set\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edict-del\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(dict-del [dict] [key])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns a new dict with a value deleted\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edict-haskey?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(dict-haskey? [dict] [key])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChecks if a dict has a key set\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edict-keys\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(dict-keys [dict])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns a list of keys in the dictionary\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edict-vals\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(dict-vals [dict])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns a list of values in the dictionary\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elen\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(len [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns the length of a collection\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereverse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(reverse [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReverses a collection\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eslice\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(slice [c] [start] [end] [step])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns a slice of a collection based on start, stop, and step numbers\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eif\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(if [pred] [then-branch] [else-branch])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eIf expression. Evaluates a predicate, and one of two branches based on the result\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edefine\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(define [sym] [value])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefines a variable in the local environment\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eglobal\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(global [sym] [value])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefines a variable in the global environment\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elet\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(let (([sym1] [val1])...) [expr])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCreates a local environment and defines variables within\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efn\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(fn ([args...]) [body])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefines an anonymous function with the specified arguments and body. The\nfunction also retains the current environment as a closure\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emacro\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(macro [name] ([args...]) [body])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDefines a macro that can operate on code before it is evaluated\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etypeof\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(typeof [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns a string representing the type of the argument\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econvert\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(convert [type] [value])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConverts a value to \u003ccode\u003etype\u003c/code\u003e, which is represented by a qsym,\nas returned by \u003ccode\u003etypeof\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eimport\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(import [path])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAttempts to import the \u003ccode\u003eawl\u003c/code\u003e file at the given path\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprint\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(print [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrints to standard output\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprintln\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(println [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrints to standard output, adding a newline\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erandom\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(random)\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns a floating point random number between 0 and 1\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eerror\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(error [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e  \u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexit\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(exit [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eExits the interactive REPL\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/tbody\u003e\n\n\u003c/table\u003e\n\n### Core Library\n\nIn addition to builtins, there exists a core library that Awl imports on\nstartup. Among other things, this library aims to exercise some of Awl's\nfeatures, as well as provide some basic functional tools.\n\n\u003ctable\u003e\n\n\u003ccolgroup\u003e\n\u003ccol style=\"width: 15%;\"\u003e\n\u003ccol style=\"width: 35%;\"\u003e\n\u003ccol style=\"width: 50%;\"\u003e\n\u003c/colgroup\u003e\n\n\u003cthead\u003e\n\u003cth\u003eSymbol\u003c/th\u003e\n\u003cth\u003eSignature\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/thead\u003e\n\n\u003ctbody\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enil\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003eAlias for \u003ccode\u003e{}\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efunc\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(func ([name] [args]) [body])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMacro that defines a named function\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eint?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(int? [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChecks that argument is an integer\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efloat?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(float? [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChecks that argument is a floating point\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estr?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(str? [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChecks that argument is a string\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebuiltin?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(builtin? [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChecks that argument is a builtin\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efn?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(fn? [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChecks that argument is a user-defined function\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emacro?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(macro? [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChecks that argument is a macro\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebool?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(bool? [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChecks that argument is a boolean\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eqexpr?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(qexpr? [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChecks that argument is a Q-Expression\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edict?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(dict? [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChecks that argument is a Dictionary\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elist?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(list? [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAlias for \u003ccode\u003eqexpr?\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enil?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(nil? [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChecks that argument is \u003ccode\u003enil\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eto-str\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(to-str [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConverts argument to a string\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eto-qsym\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(to-qsym [arg1])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eConverts argument to a Q-Symbol\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edo\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(do [expr1] [expr2] ... [exprn])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEvaluates its arguments one by one, and returns the result of the last\nargument\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecompose\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(compose [f] [g] [xs...])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eComposes two functions\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eflip\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(flip [f] [x] [y])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTakes a function and two argument, and flip the ordering of the arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eid\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(id [x])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe identity function, returns whatever is passed\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereduce\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(reduce [f] [l] [acc])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReduces a list to a single value using a reducer function\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ereduce-left\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(reduce-left [f] [l] [acc])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eLike \u003ccode\u003ereduce\u003c/code\u003e, but traverses the list in the opposite direction\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emap\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(map [f] [l])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eApplies a function to each element of a list\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efilter\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(filter [f] [l])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUses a predicate function to filter out elements from a list\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eany\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(any [f] [l])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChecks whether any value in list \u003ccode\u003el\u003c/code\u003e satisfies \u003ccode\u003ef\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eall\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(all [f] [l])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChecks whether all values in list \u003ccode\u003el\u003c/code\u003e satisfy \u003ccode\u003ef\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esum\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(sum [l])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSums elements of a list\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eproduct\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(product [l])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMultiplies together elements of a list\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epack\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(pack [f] [args...])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTakes multiple argument and feeds it to a function as a single list\nargument\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eunpack\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(unpack [f] [l])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEvaluates a function using a list of arguments\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enth\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(nth [n] [l])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns the \u003ccode\u003enth\u003c/code\u003e element of a list\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ezip\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(zip [lists...])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns a list of lists, each containing the i-th element of the argument lists\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etake\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(take [n] [l])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eTakes the first \u003ccode\u003en\u003c/code\u003e elements of a list\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edrop\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(drop [n] [l])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDrops the first \u003ccode\u003en\u003c/code\u003e elements of a list, returning what's\nleft\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emember?\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(member? [x] [l])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eChecks if an element is a member of a list\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erange\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(range [s] [e])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns a list of integers starting with \u003ccode\u003es\u003c/code\u003e and going up to\n\u003ccode\u003ee\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edict-items\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(dict-items [dict])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns a list of key-value pairs from the given dict\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erandom-between\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e(random-between [s] [e])\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eReturns a random floating point between \u003ccode\u003es\u003c/code\u003e and\n\u003ccode\u003ee\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/tbody\u003e\n\n\u003c/table\u003e\n\n## Open Source\n\nMany thanks goes to the following awesome libraries and open source projects,\nand their creators:\n\n- mpc.c\n- ptest.c\n- linenoise\n- clang / LLVM\n- emscripten\n- JQuery Terminal\n\nAlso, thanks goes to the creator of the free \"Build Your Own Lisp\" online book,\nwhich is what Awl was inspired from.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoithos%2Fawl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvoithos%2Fawl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoithos%2Fawl/lists"}