{"id":20312542,"url":"https://github.com/annimon/own-programming-language-tutorial","last_synced_at":"2025-04-05T15:02:50.889Z","repository":{"id":32358866,"uuid":"35934773","full_name":"aNNiMON/Own-Programming-Language-Tutorial","owner":"aNNiMON","description":"Source code for course \"How to create your own programming language\"","archived":false,"fork":false,"pushed_at":"2025-03-20T21:27:14.000Z","size":2898,"stargazers_count":127,"open_issues_count":0,"forks_count":24,"subscribers_count":17,"default_branch":"latest","last_synced_at":"2025-03-29T14:04:01.839Z","etag":null,"topics":["interpreted-programming-language","interpreter","java","lexer","parser","programming-language","tutorial"],"latest_commit_sha":null,"homepage":"https://www.youtube.com/playlist?list=PL81SFGIHr5IJFsoWX0qTeQ9_-MFBE552C","language":"Java","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/aNNiMON.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-05-20T08:09:26.000Z","updated_at":"2025-03-20T21:27:17.000Z","dependencies_parsed_at":"2023-10-02T21:12:30.664Z","dependency_job_id":"0332d3f3-5a1d-4b22-94af-144c4c1ebe39","html_url":"https://github.com/aNNiMON/Own-Programming-Language-Tutorial","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aNNiMON%2FOwn-Programming-Language-Tutorial","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aNNiMON%2FOwn-Programming-Language-Tutorial/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aNNiMON%2FOwn-Programming-Language-Tutorial/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aNNiMON%2FOwn-Programming-Language-Tutorial/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aNNiMON","download_url":"https://codeload.github.com/aNNiMON/Own-Programming-Language-Tutorial/tar.gz/refs/heads/latest","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247353729,"owners_count":20925329,"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","java","lexer","parser","programming-language","tutorial"],"created_at":"2024-11-14T18:06:38.111Z","updated_at":"2025-04-05T15:02:50.865Z","avatar_url":"https://github.com/aNNiMON.png","language":"Java","readme":"# OwnLang\n\nOwnLang - dynamic functional programming language inspired by Scala and Python. Available for PC, Android and Java ME devices.\n\n## Installing\n\n| Free | Pro |                                          Desktop                                           |\n| :--: | :-: |:------------------------------------------------------------------------------------------:|\n| [![Free](https://developer.android.com/images/brand/en_generic_rgb_wo_45.png)](https://play.google.com/store/apps/details?id=com.annimon.ownlang.free) | [![Pro](https://developer.android.com/images/brand/en_generic_rgb_wo_45.png)](https://play.google.com/store/apps/details?id=com.annimon.ownlang) | [v2.1.0](https://github.com/aNNiMON/Own-Programming-Language-Tutorial/releases/tag/v2.1.0) |\n\nAlso available as AUR package:\n\n```\nyay -S ownlang\n```\n\n## Key features\n\n#### Higher-order functions\n\nFunctions are values, so we can store them to variables for operating.\n\n```scala\noperations = {\n  \"+\" : def(a,b) = a+b,\n  \"-\" : def(a,b) = a-b,\n  \"*\" : def(a,b) = a*b,\n  \"/\" : ::division\n}\n\ndef division(v1, v2) {\n  if (v2 == 0) return \"error: division by zero\"\n  return v1 / v2\n}\n\nfor name, operation : operations {\n  println \"2 \" + name + \" 3 = \" + operation(2, 3)\n}\n```\n\n#### Pattern Matching\n\nPattern matching with value pattern, tuple pattern, list pattern and optional condition.\n\n```scala\ndef factorial(n) = match n {\n  case 0: 1\n  case n if n \u003c 0: 0\n  case _: n * factorial(n - 1)\n}\n\ndef fizzbuzz(limit = 100) {\n  for i = 1, i \u003c= limit, i++ {\n    println match [i % 3 == 0, i % 5 == 0] {\n      case (true, false): \"Fizz\"\n      case (false, true): \"Buzz\"\n      case (true, true): \"FizzBuzz\"\n      case _: i\n    }\n  }\n}\n\n// run\nfizzbuzz()\n```\n\n#### Functional data operations\n\nOperate data in functional style.\n\n```scala\nuse std, functional\n\nnums = [1,2,3,4,5,6,7,8,9,10]\nnums = filter(nums, def(x) = x % 2 == 0)\n// Squares of even numbers\nsquares = map(nums, def(x) = x * x)\nforeach(squares, ::echo)\n// Sum of squares\nsum = reduce(squares, 0, def(x, y) = x + y)\nprintln \"Sum: \" + sum\n// Same using stream\nprintln \"Sum: \" + stream(range(1, 11))\n  .filter(def(x) = x % 2 == 0)\n  .map(def(x) = x * x)\n  .reduce(0, def(x, y) = x + y)\n```\n\n#### Operator overloading\n\nWhy not?\n\n```scala\nuse std, types, math\n\ndef `..`(a, b) = range(a, b)\ndef `**`(a, b) = int(pow(a, b))\nfor y : 1 .. 10 {\n  println sprintf(\"2 ^ %d = %d\", y, 2 ** y)\n}\n```\n\n#### Network module\n\nEasy async HTTP requests with `http` module.\n\n```scala\nuse std, http, functional, json\n\n// GET request\nhttp(\"https://api.github.com/events\", def(r) {\n  events = jsondecode(r)\n  println events[0]\n})\n\n// POST request\nhttp(\"http://jsonplaceholder.typicode.com/users\", \"POST\", {\n  \"name\": \"OwnLang\",\n  \"versionCode\": 10\n}, ::echo)\n\n// PATCH request\nhttp(\"http://jsonplaceholder.typicode.com/users/2\", \"PATCH\", {\"name\": \"Patched Name\"}, ::patch_callback)\n\ndef patch_callback(v) {\n  println v\n}\n```\n\n## Language specification\n\n[English](https://annimon.com/docs/ownlang/en/) and [Russian](https://annimon.com/docs/ownlang/ru/)\n\n[Examples](examples/)\n\n\n## Build\n\nBuild using Gradle `./gradlew shadowJar`\n\nor take a look to [latest release](https://github.com/aNNiMON/Own-Programming-Language-Tutorial/releases/latest) for binaries.\n\n\n## Run\n\nTo run script use command\n\n`java -jar OwnLang.jar -f input.own`\n\nor \n\n`java -jar OwnLang.jar \u003c input.own`\n\n\n## License\n\nMIT - see [MIT license information](LICENSE)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fannimon%2Fown-programming-language-tutorial","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fannimon%2Fown-programming-language-tutorial","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fannimon%2Fown-programming-language-tutorial/lists"}