[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-93875":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":9,"totalLinesOfCode":9,"stars":12,"forks":13,"watchers":14,"openIssues":14,"contributorsCount":9,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":14,"stars30d":14,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":15,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":16,"fork":16,"defaultBranch":17,"hasWiki":16,"hasPages":16,"topics":9,"createdAt":9,"pushedAt":9,"updatedAt":18,"readmeContent":19,"aiSummary":20,"trendingCount":14,"starSnapshotCount":14,"syncStatus":21,"lastSyncTime":9,"discoverSource":22},93875,"eo","objectionary\u002Feo","objectionary","EOLANG, an Experimental Pure Object-Oriented Programming Language Based on 𝜑-Calculus",null,"https:\u002F\u002Fgithub.com\u002Fobjectionary\u002Feo","Java",1385,221,0,52.04,false,"main","2026-09-21 04:01:26","# Pure Object-Oriented Language, Experimental\n\n[![EO principles respected here](https:\u002F\u002Fwww.elegantobjects.org\u002Fbadge.svg)](https:\u002F\u002Fwww.elegantobjects.org)\n[![DevOps By Rultor.com](https:\u002F\u002Fwww.rultor.com\u002Fb\u002Fobjectionary\u002Feo)](https:\u002F\u002Fwww.rultor.com\u002Fp\u002Fobjectionary\u002Feo)\n[![We recommend IntelliJ IDEA](https:\u002F\u002Fwww.elegantobjects.org\u002Fintellij-idea.svg)](https:\u002F\u002Fwww.jetbrains.com\u002Fidea\u002F)\n\n[![mvn-linux](https:\u002F\u002Fgithub.com\u002Fobjectionary\u002Feo\u002Factions\u002Fworkflows\u002Fmvn.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fobjectionary\u002Feo\u002Factions\u002Fworkflows\u002Fmvn.yml)\n[![PDD status](https:\u002F\u002Fwww.0pdd.com\u002Fsvg?name=objectionary\u002Feo)](https:\u002F\u002Fwww.0pdd.com\u002Fp?name=objectionary\u002Feo)\n[![Maintainability](https:\u002F\u002Fqlty.sh\u002Fgh\u002Fobjectionary\u002Fprojects\u002Feo\u002Fmaintainability.svg)](https:\u002F\u002Fqlty.sh\u002Fgh\u002Fobjectionary\u002Fprojects\u002Feo)\n[![Maven Central](https:\u002F\u002Fimg.shields.io\u002Fmaven-central\u002Fv\u002Forg.eolang\u002Feo-parent.svg)](https:\u002F\u002Fmaven-badges.herokuapp.com\u002Fmaven-central\u002Forg.eolang\u002Feo-parent)\n[![codecov](https:\u002F\u002Fcodecov.io\u002Fgh\u002Fobjectionary\u002Feo\u002Fbranch\u002Fmaster\u002Fgraph\u002Fbadge.svg)](https:\u002F\u002Fcodecov.io\u002Fgh\u002Fobjectionary\u002Feo)\n![Lines-of-Code](https:\u002F\u002Fraw.githubusercontent.com\u002Fobjectionary\u002Feo\u002Fgh-pages\u002Floc-badge.svg)\n[![Hits-of-Code](https:\u002F\u002Fhitsofcode.com\u002Fgithub\u002Fobjectionary\u002Feo)](https:\u002F\u002Fhitsofcode.com\u002Fview\u002Fgithub\u002Fobjectionary\u002Feo)\n[![License](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-green.svg)](https:\u002F\u002Fgithub.com\u002Fobjectionary\u002Feo\u002Fblob\u002Fmaster\u002FLICENSE.txt)\n[![FOSSA Status](https:\u002F\u002Fapp.fossa.com\u002Fapi\u002Fprojects\u002Fgit%2Bgithub.com%2Fcqfn%2Feo.svg?type=shield)](https:\u002F\u002Fapp.fossa.com\u002Freports\u002F0ebb3149-4934-4565-bf6f-6fa41aed3b49)\n[![Quality Gate Status](https:\u002F\u002Fsonarcloud.io\u002Fapi\u002Fproject_badges\u002Fmeasure?project=objectionary_eo&metric=alert_status)](https:\u002F\u002Fsonarcloud.io\u002Fsummary\u002Fnew_code?id=objectionary_eo)\n\n**EO** (stands for [Elegant Objects][book] or ISO 639-1 code of [Esperanto])\nis an object-oriented programming language based on [𝜑-calculus].\nWe're aware of popular semi-OOP languages and we don't think\n  they are good enough, including [Java], [Ruby], [C++], [Python], and [C#].\nEven [Smalltalk], [Eiffel], [Self], and [Io] are not good enough.\nAll of them have something **we don't tolerate**:\n\n* types ([why?](https:\u002F\u002Fwww.yegor256.com\u002F2020\u002F11\u002F10\u002Ftyping-without-types.html))\n* static\u002Fclass methods or attributes\n  ([why?](http:\u002F\u002Fwww.yegor256.com\u002F2014\u002F05\u002F05\u002Foop-alternative-to-utility-classes.html))\n* classes ([why?](http:\u002F\u002Fwww.yegor256.com\u002F2016\u002F09\u002F20\u002Foop-without-classes.html))\n* implementation inheritance\n  ([why?](http:\u002F\u002Fwww.yegor256.com\u002F2016\u002F09\u002F13\u002Finheritance-is-procedural.html))\n* mutability\n  ([why?](http:\u002F\u002Fwww.yegor256.com\u002F2014\u002F06\u002F09\u002Fobjects-should-be-immutable.html)\n  and\n  [why not?](https:\u002F\u002Fwww.yegor256.com\u002F2016\u002F09\u002F07\u002Fgradients-of-immutability.html))\n* NULL ([why?](http:\u002F\u002Fwww.yegor256.com\u002F2014\u002F05\u002F13\u002Fwhy-null-is-bad.html))\n* global scope\n  ([why?](https:\u002F\u002Fwww.yegor256.com\u002F2018\u002F07\u002F03\u002Fglobal-variables.html))\n* type casting\n  ([why?](http:\u002F\u002Fwww.yegor256.com\u002F2015\u002F04\u002F02\u002Fclass-casting-is-anti-pattern.html))\n* reflection\n  ([why?](https:\u002F\u002Fwww.yegor256.com\u002F2022\u002F06\u002F05\u002Freflection-means-hidden-coupling.html))\n* scalar types and data primitives\n* annotations\n  ([why?](http:\u002F\u002Fwww.yegor256.com\u002F2016\u002F04\u002F12\u002Fjava-annotations-are-evil.html))\n* operators\n* traits and mixins\n  ([why?](https:\u002F\u002Fwww.yegor256.com\u002F2017\u002F03\u002F07\u002Ftraits-and-mixins.html))\n* flow control statements (`for`, `while`, `if`, etc)\n\n## Quick Start\n\nFirst, install [Java SE] and [npm].\n\nThen, install [eoc]:\n\n```bash\nnpm install -g eolang@0.36.0\n```\n\nThen, start with a simple EO program in the `app.eo` file:\n\n```eo\n# Just prints hello.\n\n[args] > app\n  stdout > @\n    \"Hello, world!\\n\"\n```\n\nCompile it like this (may take up to a minute or so):\n\n```bash\neoc --easy link\n```\n\nThen, run it:\n\n```bash\neoc --easy --alone dataize app\n```\n\nYou should see \"Hello, world!\" printed.\n\n## Simple Tutorial\n\nIn the example above, we create a new [abstract object][abstract objects]\nnamed `app`, which has a single attribute named `@`. The object\nattached to the attribute `@` is a copy of the object `stdout` with\na single argument `\"Hello, world!\"`. The object\n`stdout` is also [abstract][abstract objects].\nIt can't be used directly, a copy of it has to be created,\nwith a few required arguments provided.\nThis is how a copy of the object `stdout` is made:\n\n```text\nstdout\n  \"Hello, world!\\n\"\n```\n\nThe indentation in EO is important, just like in Python.\nThere must be two spaces\nin front of the line in order to go to the deeper level of nesting.\nThis code can also be written in a \"horizontal\" notation:\n\n```text\nstdout \"Hello, world!\"\n```\n\nMoreover, it's possible to use brackets in order to group arguments and avoid\nambiguity. For example, instead of using a plain string `\"Hello, world!\"`\nwe may want to create a copy of the object `stdout` with a more complex\nargument: a copy of the object `printf`:\n\n```eo\n# Says hello to Jeff.\n\nstdout > [] > app\n  \"Hello, %s!\".printf\n    * \"Jeffrey\"\n```\n\nHere, the object `printf` is also [abstract][abstract objects].\nIt is being copied with two arguments: `\"Hello, %s!\"` and `\"Jeffrey\"`.\nThis program can be written using horizontal notation:\n\n```eo\n[] > app\n  stdout (\"Hello, %s!\".printf (* \"Jeffrey\")) > @\n```\n\nThe special attribute `@` denotes an object that is being\n[decorated][composable decorators].\nIn this example, the object `app` decorates the copy of the\nobject `stdout` and through this starts to behave like\nthe object `stdout`: all attributes of `stdout` become the\nattributes of the `app`. The object `app` may have its own\nattributes. For example, it's possible to define a new abstract object\ninside `app` and use it to build the output string:\n\n```eo\n# Says hello to Jeff.\n\n[] > app\n  stdout (msg \"Jeffrey\") > @\n  [name] > msg\n    \"Hello, %s!\".printf (* name) > @\n```\n\nNow, the object `app` has two \"attached\" attributes: `@` and `msg`. The attribute\n`msg` has an abstract object attached to it, with a single \"void\" attribute\n`name`.\n\nThis is how you iterate:\n\n```eo\nmalloc.empty > [args] > app\n  seq * > [x] >>\n    x.put 2\n    while\n      x.as-number.lt 6 > [i] >>\n      seq * > [i] >>\n        stdout\n          \"%d x %1$d = %d\\n\".printf\n            *\n              x\n              x.as-number.times x\n        x.put\n          x.as-number.plus 1\n    true\n```\n\nThis code will print this:\n\n```text\n2 x 2 = 4\n3 x 3 = 9\n4 x 4 = 16\n5 x 5 = 25\n```\n\nGot the idea?\n\n## Grammar\n\nThe EO language is defined by [`eo-parser\u002FPARSER_SPEC.md`][parser-spec],\n  a spec-driven, line-by-line classification of every legal shape with\n  numbered rules (`R-N.M`) that the parser implementation references\n  directly.\nThe reference implementation lives in `eo-parser\u002Fsrc\u002Fmain\u002Fjava\u002Forg\u002Feolang\u002Fparser\u002F`\n  and converts EO source to [XMIR] in a single pass with no intermediate AST.\n\n## What's Next?\n\nJoin [our Telegram group](https:\u002F\u002Ft.me\u002Feolang_org).\n\nWatch [video](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=QaKIw1Bh3Oc) about EOLANG basics.\n\nRead [our blog], especially the section with\n  [recently published papers][papers].\n\nLearn [XMIR], a dialect of XML, which we use to represent EO program:\n  [XSD] and [spec][XMIR HTML].\n\nSee the full collection of canonical objects: [objectionary][home].\n\nRead more about integration [with Maven][eo-maven-plugin].\n\n## Benchmark\n\nThis is how many milliseconds were spent on different XSL stylesheets\n  during the execution of `mvn install` of the `eo-runtime` module:\n\n\u003C!-- benchmark_begin -->\n\n```text\nto-java.xsl              54412  34.43%\nclasses.xsl              45599  28.86%\nset-locators.xsl         12786  8.09%\nset-original-names.xsl   9700   6.14%\nattrs.xsl                8680   5.49%\ndata.xsl                 7990   5.06%\ntests.xsl                6403   4.05%\nanonymous-to-nested.xsl  6272   3.97%\npackage.xsl              6175   3.91%\n```\n\nThe results were calculated in [this GHA job][benchmark-gha]\non 2026-05-08 at 07:18,\non Linux with 4 CPUs.\nThe total is 158017 milliseconds.\nWe show only the first 16 most expensive XSL stylesheets.\n\n\u003C!-- benchmark_end -->\n\nYou can run this benchmark locally with the following commands.\nFirst, to generate the `measures.csv` file:\n\n```shell\nmvn clean install --errors --batch-mode -Deo.xslMeasuresFile=measures.csv\n```\n\nThen, to generate the report:\n\n```shell\nawk -F ',' '{ a[$1]+=$2; s+=$2; } END { for (k in a) \\\n printf(\"%s.xsl\\t%d\\t%0.2f%%\\n\", k, a[k], 100 * a[k]\u002Fs)}' \\\n eo-runtime\u002Fmeasures.csv | sort -g -k 2 | tail -16 | column -t | head \"-16\"\n```\n\n## Architecture\n\nThe language is formally grounded in\n  [φ-calculus](https:\u002F\u002Farxiv.org\u002Fabs\u002F2111.13384),\n  a mathematical model where every entity is an object\n  with named attributes, and objects are formed by\n  applying other objects to void attributes.\nUnlike languages based on\n  [lambda calculus](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLambda_calculus)\n  (e.g. [Haskell](https:\u002F\u002Fwww.haskell.org\u002F))\n  or class-based models\n  (e.g. [Java](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJava_(programming_language)),\n  [C++](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FC%2B%2B)),\n  EO has no types, no classes, no static methods,\n  no implementation inheritance, no NULL, and no operators.\nEverything a programmer needs to express is an object,\n  and the only way to reuse behavior is through decoration:\n  an object's `φ` (`@`) attribute points to another object\n  whose attributes are transparently forwarded,\n  replacing class inheritance entirely.\n\nThe compiler pipeline uses\n  [XMIR](https:\u002F\u002Fnews.eolang.org\u002F2022-11-25-xmir-guide.html)\n  (XML Intermediate Representation) as its sole pivot format\n  between parsing and code generation.\nUnlike traditional compilers that manipulate an in-memory AST\n  (as in [GCC](https:\u002F\u002Fgcc.gnu.org\u002F),\n  [LLVM](https:\u002F\u002Fllvm.org\u002F), or\n  [javac](https:\u002F\u002Fopenjdk.org\u002Fprojects\u002Fcompiler-grammar\u002F)),\n  every compilation artifact in EO is a serializable XML document\n  governed by an [XSD schema](https:\u002F\u002Fwww.eolang.org\u002FXMIR.xsd).\nThis makes every intermediate state inspectable with\n  standard XML tools and independently testable.\n\nAll transformations at both parse-time normalization\n  and transpile-time code generation are implemented as\n  pipelines of [XSLT 2.0](https:\u002F\u002Fwww.w3.org\u002FTR\u002Fxslt20\u002F) stylesheets\n  rather than visitor passes written in the host language.\nIn most compilers transformations are encoded as Java\u002FC++ AST visitors\n  (e.g. [Eclipse JDT](https:\u002F\u002Feclipse.dev\u002Fjdt\u002F),\n  [Roslyn](https:\u002F\u002Fgithub.com\u002Fdotnet\u002Froslyn));\n  here each transformation step is a self-contained `.xsl` file\n  that can be tested, measured, and replaced without touching Java code.\nThe benchmark section above reflects the measurable cost of each\n  stylesheet.\n\nThe build system integration uses\n  [Apache Maven](https:\u002F\u002Fmaven.apache.org\u002F) as the compilation driver.\nEO is compiled as part of a Maven lifecycle:\n  the `eo-maven-plugin` module exposes mojos\n  (`parse`, `assemble`, `transpile`, etc.)\n  that run during `generate-sources` and `process-sources` phases,\n  integrating EO into the existing Java toolchain\n  without a separate build tool—unlike languages with custom toolchains\n  such as [Rust](https:\u002F\u002Fwww.rust-lang.org\u002F) (`cargo`)\n  or [Go](https:\u002F\u002Fgo.dev\u002F) (`go build`).\n\nExternal EO objects are resolved from\n  [Objectionary](https:\u002F\u002Fgithub.com\u002Fobjectionary\u002Fhome),\n  a Git-hosted registry of canonical objects,\n  not from a binary artifact repository like\n  [Maven Central](https:\u002F\u002Fsearch.maven.org\u002F) or\n  [npm](https:\u002F\u002Fwww.npmjs.com\u002F).\nThe `MjPull` mojo fetches missing `.eo` sources from Objectionary\n  at build time and caches them locally,\n  so dependencies are always available as readable source,\n  not opaque compiled artifacts.\n\nThe standard library is written in EO itself.\nObjects such as `bytes`, `number`, `string`, `tuple`, and `seq`\n  live in `eo-runtime\u002Fsrc\u002Fmain\u002Feo\u002F` as plain `.eo` files,\n  compiled by the same pipeline and shipped in the runtime JAR.\nThis self-hosting constraint forces the compiler and runtime\n  to be correct for the subset of EO used by the standard library,\n  and it means a new contributor can read and modify\n  primitive behavior without touching Java.\n\n## How to Contribute\n\nFork repository, make changes, then send us a [pull request][guidelines].\nWe will review your changes and apply them to the `master` branch shortly,\n  provided they don't violate our quality standards.\nTo avoid frustration, before sending us your pull request\n  please run full [Maven] build:\n\n```bash\nmvn clean install -Pqulice\n```\n\nYou will need [Maven] 3.3+ and [Java] 11+ installed.\nAlso, if you have [xcop] installed, make sure it is version `0.8.0`+.\n\n## Contributors\n\n[![contributors](https:\u002F\u002Fcontributors-img.web.app\u002Fimage?repo=objectionary\u002Feo)](https:\u002F\u002Fgithub.com\u002Fobjectionary\u002Feo\u002Fgraphs\u002Fcontributors)\n\n## Special thanks\n\nWe are using the [YourKit Java Profiler]\nto enhance the performance of EO components:\n\n[![YourKit](https:\u002F\u002Fwww.yourkit.com\u002Fimages\u002Fyklogo.png)](https:\u002F\u002Fwww.yourkit.com)\n\n[abstract objects]: https:\u002F\u002Fwww.yegor256.com\u002F2020\u002F12\u002F01\u002Fabstract-objects.html\n[benchmark-gha]: https:\u002F\u002Fgithub.com\u002Fobjectionary\u002Feo\u002Factions\u002Fruns\u002F25542370898\n[book]: http:\u002F\u002Fwww.yegor256.com\u002Felegant-objects.html\n[C#]: https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FC_Sharp_%28programming_language%29\n[C++]: https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FC%2B%2B\n[composable decorators]: https:\u002F\u002Fwww.yegor256.com\u002F2015\u002F02\u002F26\u002Fcomposable-decorators.html\n[Eiffel]: https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FEiffel_(programming_language)\n[eo-maven-plugin]: https:\u002F\u002Fgithub.com\u002Fobjectionary\u002Feo\u002Ftree\u002Fmaster\u002Feo-maven-plugin\n[eoc]: https:\u002F\u002Fgithub.com\u002Fobjectionary\u002Feoc\n[Esperanto]: https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FEsperanto\n[guidelines]: https:\u002F\u002Fwww.yegor256.com\u002F2014\u002F04\u002F15\u002Fgithub-guidelines.html\n[home]: https:\u002F\u002Fgithub.com\u002Fobjectionary\u002Fhome\n[Io]: https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIo_(programming_language)\n[Java SE]: https:\u002F\u002Fwww.oracle.com\u002Fjava\u002Ftechnologies\u002Fdownloads\u002F\n[Java]: https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJava_%28programming_language%29\n[Maven]: https:\u002F\u002Fmaven.apache.org\n[npm]: https:\u002F\u002Fdocs.npmjs.com\u002Fdownloading-and-installing-node-js-and-npm\n[our blog]: https:\u002F\u002Fnews.eolang.org\n[papers]: https:\u002F\u002Fnews.eolang.org\u002Fpapers.html\n[parser-spec]: https:\u002F\u002Fgithub.com\u002Fobjectionary\u002Feo\u002Fblob\u002Fmaster\u002Feo-parser\u002FPARSER_SPEC.md\n[Python]: https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPython_%28programming_language%29\n[Ruby]: https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRuby_%28programming_language%29\n[Self]: https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSelf_(programming_language)\n[Smalltalk]: https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSmalltalk\n[xcop]: https:\u002F\u002Fgithub.com\u002Fyegor256\u002Fxcop\n[XMIR HTML]: https:\u002F\u002Fwww.eolang.org\u002FXMIR.html\n[XMIR]: https:\u002F\u002Fnews.eolang.org\u002F2022-11-25-xmir-guide.html\n[XSD]: https:\u002F\u002Fwww.eolang.org\u002FXMIR.xsd\n[YourKit Java Profiler]: https:\u002F\u002Fwww.yourkit.com\u002Fjava\u002Fprofiler\n[𝜑-calculus]: https:\u002F\u002Farxiv.org\u002Fabs\u002F2111.13384\n","EO 是一种实验性的纯面向对象编程语言，基于 φ-演算理论构建，旨在消除传统 OOP 中的类型系统、类、静态成员、继承、可变状态、NULL 和全局作用域等设计。其核心特点是仅通过对象及其消息传递建模，所有实体均为不可变对象，支持编译为 Java 字节码并在 JVM 上运行。项目提供 EO 编译器、运行时和标准库，适用于教学研究、OOP 理论验证及对函数式与对象范式融合感兴趣的开发者。",2,"trending"]