{"id":15439244,"url":"https://github.com/maxbarsukov/yascriptlang","last_synced_at":"2025-04-19T18:33:17.892Z","repository":{"id":41972019,"uuid":"400754133","full_name":"maxbarsukov/yascriptlang","owner":"maxbarsukov","description":"🦎 A simple Lisp-inspired scripting language that compiles to JS","archived":false,"fork":false,"pushed_at":"2022-04-21T10:35:08.000Z","size":338,"stargazers_count":9,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-29T11:41:37.011Z","etag":null,"topics":["interpreted-programming-language","interpreter","js-interpreter","lisp-dialect","programming-language"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/yascriptlang","language":"JavaScript","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/maxbarsukov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-08-28T09:32:11.000Z","updated_at":"2024-02-08T12:50:11.000Z","dependencies_parsed_at":"2022-08-12T01:01:01.624Z","dependency_job_id":null,"html_url":"https://github.com/maxbarsukov/yascriptlang","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxbarsukov%2Fyascriptlang","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxbarsukov%2Fyascriptlang/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxbarsukov%2Fyascriptlang/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxbarsukov%2Fyascriptlang/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxbarsukov","download_url":"https://codeload.github.com/maxbarsukov/yascriptlang/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249565235,"owners_count":21292427,"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":["interpreted-programming-language","interpreter","js-interpreter","lisp-dialect","programming-language"],"created_at":"2024-10-01T19:03:49.826Z","updated_at":"2025-04-19T18:33:17.874Z","avatar_url":"https://github.com/maxbarsukov.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Yascriptlang\n\n[![Build Status](https://app.travis-ci.com/maxbarsukov/yascriptlang.svg?branch=master)](https://app.travis-ci.com/maxbarsukov/yascriptlang)\n[![npm version](https://badge.fury.io/js/yascriptlang.svg)](https://www.npmjs.com/package/yascriptlang)\n[![Downloads](https://img.shields.io/npm/dm/yascriptlang.svg)](https://www.npmjs.com/package/yascriptlang)\n[![Package Size](https://img.shields.io/bundlephobia/min/yascriptlang)](https://www.npmjs.com/package/yascriptlang)\n\n![Yascriptlang Logo](https://github.com/maxbarsukov/yascriptlang/blob/master/docs/logo.png?raw=true)\n\n**Y**et **A**nother **Script** **Lang**uage\n\n\u003e Because everyone should have their own Lisp\n\n***Yascriptlang*** is high-level and multi-paradigm language.\nIt has curly-bracket syntax, strong dynamic typing, recursion, and first-class functions.\n\nAs a multi-paradigm language, ***yascriptlang*** supports functional and imperative programming styles both.\n\n***Yascriptlang*** can be interpreted as well as **compiled in JavaScript**.\n\n## Installing\n\n```bash\nnpm install -g yascriptlang\n```\n\n## Documentation\n\nThe documentation is located in the [docs](https://github.com/maxbarsukov/yascriptlang/tree/master/docs) folder.\n\n## Usage\n\nRun interpreter:\n```bash\nyas input.yas\n```\n\nCompile to **JS**:\n```bash\nyasc input.yas output.js\n```\n\nCompile to **JS** and run:\n```bash\nyasjs input.yas\n```\n\n## Building\n\n### Pre-reqs\n\nTo build and run this app locally you will need a few things:\n\n- Install [Node.js](https://nodejs.org/en/);\n\n### Getting start\n\n- Clone the repository\n```bash\ngit clone --depth=1 https://github.com/maxbarsukov/yascriptlang.git\n```\n- Install dependencies\n```bash\ncd yascriptlang\nyarn\n```\n- Run\n```bash\nnode bin/yas.js input.yas\n# or\nnode bin/yasc.js input.yas output.js\n# or\nnode bin/yasjs.js input.yas\n````\n\n## Examples of code\n\nHere are some code examples. Go to there [docs](https://github.com/maxbarsukov/yascriptlang/tree/master/docs) to see more.\n\nComments:\n```ruby\n### Comments\n# comment\n```\n```js\n// comment\n/*\nmulti\nline\ncomment\n*/\n```\n\nStrings:\n\n```ruby\nprintln(\"Hello World!\");\nprintln('Hello World!');\nprintln('Hello \" World!');\nprintln(\"Hello ' World!\");\nprintln('My name is ' ++ 'Max'); # =\u003e My name is Max\n```\n\nMath:\n\n```ruby\nprintln(2 + 2 * 2); # =\u003e 6\nprintln(3 ** 3); # =\u003e 27\nprintln(10 / 5); # =\u003e 2\nprintln(17 % 3); # =\u003e 2\n```\n\nVariables:\n(variables are *immutable* by default)\n\n```ruby\ndef pi = 3.14;\nprintln(pi);\n\ndef a = {\n  10;\n  15   # the last semicolon can be missing\n};\nprint(a); # prints 15\n\ndef mut b = 1;\nb += 2;\nb **= 3;\nprintln(b); # =\u003e 27\n```\n\nRaw JS:\n\n```ruby\nprintln(_js_ '[0, 1, 2, 3].length * 2') # =\u003e 8\nprintln(_js_ 'console.log(\"HI!\"); 2+4') # =\u003e prints HI! and 6\nprintln(_js_ '((a) =\u003e { console.log(`HI, ${a}!`)})(\"Max\")') # =\u003e prints HI, Max!\n```\n\nMutable Variables:\n\n```ruby\ndef mut a = 3\na = 2;\nprintln(a); # =\u003e 2\n```\n\nFunctions:\n\n```ruby\ndef fib = fn (n) -\u003e if n \u003c 2 then n else fib(n - 1) + fib(n - 2);\nprintln(fib(15));\n\ndef print_range = fn(a, b) -\u003e\n                if a \u003c= b then {\n                  print(a);\n                  if a + 1 \u003c= b {\n                    print(\", \");\n                    print_range(a + 1, b);\n                  } else println(\"\");\n                };\nprint_range(1, 5); # =\u003e 1, 2, 3, 4, 5\n\ndef func = fn-\u003e {\n  10;\n  20;\n};\n\nprintln(func()); # =\u003e 20. Functions returns the last var\n```\n\nLambdas:\n\n```ruby\n# fn-\u003e {} is short for fn() -\u003e {}\n\n(fn-\u003e\n  println(3 ** 3);\n)();\n```\n\nPipes:\n\n```ruby\ndef k = 200;\nk |\u003e println; # prints 200\n\n2 |\u003e fn(x) -\u003e (x * x) |\u003e println; # prints 4\n```\n\nBenchmarks:\n\n```ruby\ntime(fn-\u003e {\n  println(fib(15));\n});\n```\n\nLet:\n\n```ruby\ndef a = 1;\nlet (mut a = 10) -\u003e {\n    println(a); # =\u003e 10\n  };\nprintln(a); # =\u003e 1\n\n\nprint(let loop(n = 10) -\u003e\n  if n \u003e 0 then n + loop(n - 1)\n  else 0);\n# =\u003e 55\n\nlet (x = 2, y = x + 1, z = x + y) -\u003e\n  println(x + y + z); # =\u003e 10\n\n\nlet (x = 10) -\u003e {\n  let (x = x * 2, y = x * x) -\u003e {\n    println(x); # 20\n    println(y); # 400\n  };\n  println(x); # 10\n};\n\n```\n\nif / else:\n\n```ruby\ndef f = fn-\u003e { true; };\ndef a = if f() then \"OK\" else \"FAIL\"; # OK\nif 1 == 1 \u0026\u0026 2 \u003c 5 then print(\"OK\"); # OK\n```\n\ntrue / false :\n\n```ruby\nif true then print(\"OK\"); # OK\nif !false then print(\"OK\"); # OK\nif false then print(\"Won't be printed\");\n```\n\nLists:\n\n```ruby\ndef list = cons(1, cons(2, cons(3, cons(4, cons(5, NIL)))));\nprint(car(list)); # 1\nprint(car(cdr(list))); # 2\nprint(car(cdr(cdr(list)))); # 3\nprint(car(cdr(cdr(cdr(list))))); # 4\nprint(car(cdr(cdr(cdr(cdr(list)))))); # 5\n```\n\nYield:\n\n```ruby\nfoo = with-yield(fn(yield) -\u003e {\n  yield(1);\n  yield(2);\n  yield(3);\n  \"DONE\";\n});\n\nprintln(foo()); # 1\nprintln(foo()); # 2\nprintln(foo()); # 3\nprintln(foo()); # DONE\n```\n\nSome stdlib methods:\n\n```ruby\n# foreach\nforeach(x, println); # prints from 1 to 5 by println\n\n# range\nforeach(range(1, 8), fn(x) -\u003e println(x * x));\n# or\nforeach(range(1, 8), fn(x) -\u003e (x * x) |\u003e println);\n# prints 1, 4, 9, 16, ... 49, 64\n\n# throw / catch\nexit = false;\nx = 0;\ncallcc( fn(k) -\u003e exit = k );\nif x == 0 then catch(\"foo\", fn-\u003e {\nprintln(\"in catch\");\nx = 1;\nexit();\n});\nprintln(\"After catch\");\nthrow(\"foo\", \"FOO\");\n```\n\n## License\n\nThe package is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxbarsukov%2Fyascriptlang","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxbarsukov%2Fyascriptlang","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxbarsukov%2Fyascriptlang/lists"}