{"id":26536964,"url":"https://github.com/andcool-systems/html8","last_synced_at":"2025-03-21T22:17:46.501Z","repository":{"id":283700734,"uuid":"948607790","full_name":"Andcool-Systems/html8","owner":"Andcool-Systems","description":"Open source HTML8 language compiler","archived":false,"fork":false,"pushed_at":"2025-03-21T17:01:25.000Z","size":47,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-21T17:30:46.520Z","etag":null,"topics":["c","compiler","esoteric"],"latest_commit_sha":null,"homepage":"","language":"Rust","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/Andcool-Systems.png","metadata":{"files":{"readme":"README.md","changelog":null,"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}},"created_at":"2025-03-14T16:25:27.000Z","updated_at":"2025-03-21T17:01:29.000Z","dependencies_parsed_at":"2025-03-21T17:42:41.035Z","dependency_job_id":null,"html_url":"https://github.com/Andcool-Systems/html8","commit_stats":null,"previous_names":["andcool-systems/html8"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Andcool-Systems%2Fhtml8","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Andcool-Systems%2Fhtml8/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Andcool-Systems%2Fhtml8/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Andcool-Systems%2Fhtml8/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Andcool-Systems","download_url":"https://codeload.github.com/Andcool-Systems/html8/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244875043,"owners_count":20524591,"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":["c","compiler","esoteric"],"created_at":"2025-03-21T22:17:45.898Z","updated_at":"2025-03-21T22:17:46.494Z","avatar_url":"https://github.com/Andcool-Systems.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# HTML8\nHTML8 — это высокоуровневый компилируемый язык программирования, имеющий синтаксис, подобный HTML.\n\n## Описание синтаксиса языка\n\nПрограмма имеет общую структуру вида:\n```xml\n\u003c!DOCTYPE html8\u003e\n\u003chtml\u003e\n\u003chead\u003e\n    \u003chead-code\u003e\n\u003c/head\u003e\n\u003cmain\u003e\n    \u003cmain-program-code\u003e\n\u003c/main\u003e\n\u003c/html\u003e\n```\n\nБлок `html` должен обязательно содержать блок `main`, который является точкой входа. Также дополнительно может быть объявлен блок `head`, в котором подключаются отдельные модули, объявляются константы и так далее.\n\n## Области видимости\nВсе переменные и функции, которые были созданы в корне блока `main` будут доступны всем дочерним блокам. Переменные, объявленные внутри дочерних блоков не будут доступны из родительских, но также будут доступны для дочерних. Для определения пустого блока можно использовать конструкцию `\u003cdiv\u003e\u003c/div\u003e`. После завершения блока, все объекты, которые были созданы внутри уничтожаются и более не будут доступны по имени.\n\n## Резервирование имен\nЯзык резервирует за собой несколько ключевых слов. Эти слова не могут быть использованы в именах переменных или функций. Такие слова как `html, head, main, div` и далее будут расцениваться компилятором **исключительно как ключевые слова**. Все попытки создать переменную или функцию с таким именем будут приводить к ошибке компиляции.\n\n## Переменные\nТак как язык статически типизируемый, тип переменной должен быть известен на моменте компиляции. Синтаксис объявления переменной:\n```xml\n\u003cint name=\"my_var\"\u003e12\u003c/int\u003e\n```\n\nВ этом примере создается переменная my_var со значением 12. Использование других переменных как значение для инициализации так же разрешается. Разрешается также создавать переменные, в качестве имени которых указана другая **константная** переменная. В этом случае имя переменной указывается в фигурных скобках: \n```xml\n\u003cint name=\"my_constant_var\" const\u003e\"my_cool_var\"\u003c/int\u003e\n\u003cint name={my_constant_var}\u003e12\u003c/int\u003e\n```\n\nИспользование неконстантных переменных в качестве имени запрещается, в ином случае будет вызвана ошибка компиляции.\n\n### Изменение переменных\nПосле создания *неконстантной* переменной её значение можно изменить на другое с таким же типом. При этом синтаксис имеет вид:\n```xml\n\u003cmy_var\u003e16\u003c/my_var\u003e\n```\n\nВ этом случае в качестве имени тега используется название переменной, с которым она была создана. (Важно отметить, что приоритет в парсинге отдается зарезервированным ключевым словам, а потом только именам объектов).\n\n### Математические операции внутри блоков\nВнутри блоков разрешены математические операции, например:\n```xml\n\u003cmy_var\u003e2 * 2\u003c/my_var\u003e\n```\n\nВ результате в переменную попадет результат выполнения математической операции. (Предполагается, что на моменте компиляции константные значения будут упрощены и оптимизированы)\n\n## Функции\nОбъявление функций почти не отличается от объявления переменной:\n```xml\n\u003cint name=\"my_func\" arg1=\"int\"\u003e\n    \u003cfunction-body\u003e\n    \u003creturn val={my_var} /\u003e\n\u003c/int\u003e\n```\n\nИспользуемое при создании функции ключевое слова показывает, какой тип возвращает функция. Ключевое слово `return` принимает один аргумент `val`, который будет возвращен из функции. Если возвращаемым типом является `void`, то функцию `return` можно не вызывать.\nАргумент `arg1` имеет тип `int` и может быть использован по своему имени внутри блока функции.    \n\nКак вы уже заметили, создание переменной и функции мало чем отличаются. Это связано с тем, что язык реализует переменные через функции с предвычисленным значением. Изначально все функции являются переменными до тех пор, пока в их теле не появится хоть одно служебное слово. Например:\n\n```xml\n\u003c!-- Это переменная --\u003e\n\u003cint name=\"hello\"\u003e\n    1 + 2\n\u003c/int\u003e\n\n\u003c!-- А это уже функция, так как в ее теле появился вызов функции println --\u003e\n\u003cint name=\"hello\"\u003e\n    \u003cprintln stdout={my_var} /\u003e\n    \u003creturn val={my_var} /\u003e\n\u003c/int\u003e\n```\n\n### Вызов функций\nВызов функции производится через одиночный тег `\u003cfunc_name arg1={my_var} /\u003e` при этом порядок передачи аргументов не важен. Результат выполнения функции будет передан в блок выше. Результат может быть принят, а может быть подавлен. Пример:\n```jsx\n\u003chtml\u003e\n    \u003chead\u003e\n    \u003c/head\u003e\n    \u003cmain\u003e\n        \u003cint name=\"a\"\u003e1\u003c/int\u003e\n        \u003cint name=\"b\"\u003e2\u003c/int\u003e\n\n        \u003cint name=\"my_func\" arg=\"int\"\u003e\n            \u003creturn val={arg + b} /\u003e\n        \u003c/int\u003e\n\n        \u003cint name=\"result\"\u003e\n            \u003cmy_func arg={a} /\u003e\n        \u003c/int\u003e\n\n        \u003cprintln stdout={result} /\u003e\n    \u003c/main\u003e\n\u003c/html\u003e\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandcool-systems%2Fhtml8","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandcool-systems%2Fhtml8","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandcool-systems%2Fhtml8/lists"}