eo

EOLANG, an Experimental Pure Object-Oriented Programming Language Based on 𝜑-Calculus

https://github.com/objectionary/eo

Science Score: 64.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
    Found CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
  • Academic publication links
    Links to: arxiv.org
  • Committers with academic emails
    4 of 77 committers (5.2%) from academic institutions
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (8.0%) to scientific vocabulary

Keywords

eolang java language object-oriented object-oriented-language object-oriented-programming oop programming-language

Keywords from Contributors

sequences interpretability hack fair meshing ranking robust standardization mathematics optim
Last synced: 4 months ago · JSON representation ·

Repository

EOLANG, an Experimental Pure Object-Oriented Programming Language Based on 𝜑-Calculus

Basic Info
  • Host: GitHub
  • Owner: objectionary
  • License: mit
  • Language: Java
  • Default Branch: master
  • Homepage: https://www.eolang.org
  • Size: 419 MB
Statistics
  • Stars: 1,259
  • Watchers: 37
  • Forks: 166
  • Open Issues: 86
  • Releases: 0
Topics
eolang java language object-oriented object-oriented-language object-oriented-programming oop programming-language
Created about 9 years ago · Last pushed 4 months ago
Metadata Files
Readme License Code of conduct Citation

README.md

Pure Object-Oriented Language, Experimental

EO principles respected here DevOps By Rultor.com We recommend IntelliJ IDEA

mvn-linux PDD status Maintainability Maven Central codecov Lines-of-Code Hits-of-Code License FOSSA Status Codacy Badge Known Vulnerabilities Code Smells

EO (stands for Elegant Objects or ISO 639-1 code of Esperanto) is an object-oriented programming language based on 𝜑-calculus. We're aware of popular semi-OOP languages and we don't think they are good enough, including: Java, Ruby, C++, Smalltalk, Python, PHP, C#. All of them have something we don't tolerate:

  • types (why?)
  • static/class methods or attributes (why?)
  • classes (why?)
  • implementation inheritance (why?)
  • mutability (why? and why not?)
  • NULL (why?)
  • global scope (why?)
  • type casting (why?)
  • reflection (why?)
  • scalar types and data primitives
  • annotations (why?)
  • operators
  • traits and mixins (why?)
  • flow control statements (for, while, if, etc)

Quick Start

First, install Java SE and npm.

Then, install eoc:

bash npm install -g eolang@0.32.1

Then, start with a simple EO program in the app.eo file:

```eo

Just prints hello.

[args] > app QQ.io.stdout > @ "Hello, world!\n" ```

Compile it like this (may take up to a minute or so):

bash eoc --easy link

Then, run it:

bash eoc --easy --alone dataize app

You should see "Hello, world!" printed.

Simple Tutorial

In the example above, we create a new abstract object named app, which has a single attribute named @. The object attached to the attribute @ is a copy of the object stdout with a single argument "Hello, world!". The object stdout is also abstract. It can't be used directly, a copy of it has to be created, with a few required arguments provided. This is how a copy of the object stdout is made:

text QQ.io.stdout "Hello, world!\n"

The indentation in EO is important, just like in Python. There must be two spaces in front of the line in order to go to the deeper level of nesting. This code can also be written in a "horizontal" notation:

text QQ.io.stdout "Hello, world!"

Moreover, it's possible to use brackets in order to group arguments and avoid ambiguity. For example, instead of using a plain string "Hello, world!" we may want to create a copy of the object stdout with a more complex argument: a copy of the object sprintf:

```eo

Says hello to Jeff.

[] > app QQ.io.stdout > @ QQ.txt.sprintf "Hello, %s!" * "Jeffrey" ```

Here, the object sprintf is also abstract. It is being copied with two arguments: "Hello, %s!" and "Jeffrey". This program can be written using horizontal notation:

```eo +alias org.eolang.io.stdout +alias org.eolang.txt.sprintf

Also says hello to Jeff.

[] > app stdout (sprintf "Hello, %s!" (* "Jeffrey")) > @ ```

The special attribute @ denotes an object that is being decorated. In this example, the object app decorates the copy of the object stdout and through this starts to behave like the object stdout: all attributes of stdout become the attributes of the app. The object app may have its own attributes. For example, it's possible to define a new abstract object inside app and use it to build the output string:

```eo

Says hello to Jeff.

[] > app QQ.io.stdout (msg "Jeffrey") > @ [name] > msg QQ.txt.sprintf "Hello, %s!" (* name) > @ ```

Now, the object app has two "bound" attributes: @ and msg. The attribute msg has an abstract object attached to it, with a single "free" attribute name.

This is how you iterate:

eo [args] > app malloc.for > @ 0 [x] >> seq * > @ x.put 2 while x.as-number.lt 6 > [i] >> [i] >> seq * > @ QQ.io.stdout QQ.txt.sprintf *1 "%d x %1$d = %d\n" x x.as-number.times x x.put x.as-number.plus 1 true

This code will print this:

text 2 x 2 = 4 3 x 3 = 9 4 x 4 = 16 5 x 5 = 25

Got the idea?

Backus-Naur Form

This is our EBNF of EO language:

Grammar

The PNG image was auto-generated. It's better to use ebnf/Eo.svg.

What's Next?

Join our Telegram group.

Watch video about EOLANG basics.

Read our blog, especially the section with recently published papers.

Learn XMIR, a dialect of XML, which we use to represent EO program: XSD and spec.

See the full collection of canonical objects: objectionary.

Read more about integration with Maven.

Benchmark

This is how many milliseconds were spent on different XSL stylesheets during the execution of mvn install of the eo-runtime module:

text to-java.xsl 78929 41.08% classes.xsl 60946 31.72% set-locators.xsl 14251 7.42% set-original-names.xsl 9729 5.06% attrs.xsl 7444 3.87% data.xsl 6765 3.52% package.xsl 4721 2.46% anonymous-to-nested.xsl 4702 2.45% tests.xsl 4639 2.41%

The results were calculated in this GHA job on 2025-08-21 at 17:15, on Linux with 4 CPUs. The total is 192126 milliseconds. We show only the first 16 most expensive XSL stylesheets.

You can run this benchmark locally with the following commands. First, to generate the measures.csv file:

shell mvn clean install --errors --batch-mode -Deo.xslMeasuresFile=measures.csv

Then, to generate the report:

shell awk -F ',' '{ a[$1]+=$2; s+=$2; } END { for (k in a) \ printf("%s.xsl\t%d\t%0.2f%%\n", k, a[k], 100 * a[k]/s)}' \ eo-runtime/measures.csv | sort -g -k 2 | tail -16 | column -t | head "-16"

How to Contribute

Fork repository, make changes, then send us a pull request. We will review your changes and apply them to the master branch shortly, provided they don't violate our quality standards. To avoid frustration, before sending us your pull request please run full Maven build:

bash mvn clean install -Pqulice

You will need Maven 3.3+ and Java 11+ installed. Also, if you have xcop installed, make sure it is version 0.8.0+.

Contributors

contributors

Special thanks

We are using the YourKit Java Profiler to enhance the performance of EO components:

YourKit

Owner

  • Name: Objectionary
  • Login: objectionary
  • Kind: organization
  • Email: github@objectionary.com

EO Programming Language, Its Objects, and 𝜑-calculus

Citation (CITATION.cff)

cff-version: 1.2.0
message: "If you use this software, please cite it as below."
authors:
- family-names: "Bugayenko"
  given-names: "Yegor"
  orcid: "https://orcid.org/0000-0001-6370-0678"
title: "EOLANG and φ-calculus"
version: 0.23.0
doi: 10.48550/arXiv.2111.13384
date-released: 2022-05-09
url: "https://github.com/objectionary/eo"

Committers

Last synced: 7 months ago

All Time
  • Total Commits: 8,588
  • Total Committers: 77
  • Avg Commits per committer: 111.532
  • Development Distribution Score (DDS): 0.723
Past Year
  • Commits: 2,118
  • Committers: 23
  • Avg Commits per committer: 92.087
  • Development Distribution Score (DDS): 0.666
Top Committers
Name Email Commits
Yegor Bugayenko y****6@g****m 2,383
maxonfjvipon m****v@g****m 1,498
volodya-lombrozo v****o@g****m 1,159
levBagryansky 2****1@g****m 723
renovate[bot] 2****] 529
graur a****r@y****u 297
Roman Korostinskiy 7****3 256
andreoss a****s@s****g 195
h1alexbel h****x@g****m 136
mximp m****v@g****m 135
Suban05 a****4@g****m 109
mpetrov m****v@r****u 93
Ivan c****g@g****m 73
MikhailLipanin m****n@g****m 70
Alekseeva Yana n****6@g****m 66
Stepa Strunkov s****v@g****m 64
EugeneDar e****r@m****u 52
rultor 8****r 50
uchitsa u****a@y****u 48
nlchar c****e@n****s 47
includealex m****a@p****u 42
Yegor Bugayenko y****r@t****o 41
g4s8 g****c@g****m 33
Artem Getmanskii r****0@y****u 30
Karina5005 k****1@g****m 29
OlesiaSub l****b@m****u 29
maximtrunnikov m****v@m****u 29
h1alexbel h****l@g****m 27
Andrew Smirnov s****9@y****u 26
Vladislav Samsonov v****m@g****m 24
and 47 more...

Issues and Pull Requests

Last synced: 4 months ago

All Time
  • Total issues: 727
  • Total pull requests: 1,462
  • Average time to close issues: about 2 months
  • Average time to close pull requests: 6 days
  • Total issue authors: 33
  • Total pull request authors: 43
  • Average comments per issue: 3.24
  • Average comments per pull request: 2.81
  • Merged pull requests: 1,117
  • Bot issues: 8
  • Bot pull requests: 700
Past Year
  • Issues: 381
  • Pull requests: 1,053
  • Average time to close issues: 18 days
  • Average time to close pull requests: 3 days
  • Issue authors: 18
  • Pull request authors: 27
  • Average comments per issue: 2.91
  • Average comments per pull request: 2.61
  • Merged pull requests: 821
  • Bot issues: 4
  • Bot pull requests: 543
Top Authors
Issue Authors
  • yegor256 (217)
  • 0pdd (206)
  • volodya-lombrozo (88)
  • maxonfjvipon (73)
  • h1alexbel (42)
  • levBagryansky (28)
  • deemp (20)
  • c71n93 (7)
  • l3r8yJ (7)
  • mximp (6)
  • Suban05 (5)
  • renovate[bot] (4)
  • Marat-Tim (4)
  • Chamber6821 (3)
  • github-actions[bot] (3)
Pull Request Authors
  • renovate[bot] (619)
  • maxonfjvipon (316)
  • github-actions[bot] (184)
  • volodya-lombrozo (102)
  • h1alexbel (101)
  • yegor256 (97)
  • levBagryansky (41)
  • Suban05 (30)
  • c71n93 (29)
  • ArtemGet (15)
  • asmirnov-backend (14)
  • uchitsa (13)
  • Copilot (11)
  • Graur (11)
  • vl4ds4m (10)
Top Labels
Issue Labels
bug (441) pdd (206) help wanted (76) enhancement (70) good-title (56) good first issue (44) question (22) build failed (8) core (5) 0crat/new (2)
Pull Request Labels
core (574) codeball:needs-careful-review (18) bug (9) codeball:approved (8) dependencies (1) java (1) help wanted (1) good first issue (1) pdd (1)

Dependencies

.github/workflows/codecov.yml actions
  • actions/cache v3 composite
  • actions/checkout v3 composite
  • actions/setup-java v3 composite
  • codecov/codecov-action v3 composite
.github/workflows/latexmk.yml actions
  • actions/checkout v3 composite
  • yegor256/latexmk-action 0.7.1 composite
.github/workflows/mvn.yml actions
  • actions/cache v3 composite
  • actions/checkout v3 composite
  • actions/setup-java v3 composite
.github/workflows/pdd.yml actions
  • actions/checkout v3 composite
  • g4s8/pdd-action master composite
.github/workflows/xcop.yml actions
  • actions/checkout v3 composite
  • g4s8/xcop-action master composite
.github/workflows/year.yml actions
  • FantasticFiasco/action-update-license-year v2 composite
  • actions/checkout v3 composite
eo-maven-plugin/pom.xml maven
  • com.jcabi:jcabi-maven-slf4j 0.12.2 compile
  • javax.json:javax.json-api 1.1.4 provided
  • org.apache.maven.plugin-tools:maven-plugin-annotations 3.7.1 provided
  • org.apache.maven:maven-core 3.8.7 provided
  • org.apache.maven:maven-model 3.8.7 provided
  • org.apache.maven:maven-plugin-api 3.8.7 provided
  • org.slf4j:slf4j-reload4j 2.0.6 provided
  • ch.qos.reload4j:reload4j 1.2.24
  • com.google.code.findbugs:annotations
  • com.jcabi.incubator:xembly
  • com.jcabi:jcabi-log
  • com.jcabi:jcabi-xml
  • com.opencsv:opencsv 5.7.1
  • com.yegor256:tojos 0.17.0
  • com.yegor256:xsline
  • net.sf.saxon:Saxon-HE
  • org.antlr:antlr4-runtime
  • org.cactoos:cactoos
  • org.eolang:eo-parser ${project.version}
  • org.eolang:jucs
  • org.eolang:xax
  • org.glassfish:javax.json 1.1.4
  • org.junit-pioneer:junit-pioneer
  • org.junit.jupiter:junit-jupiter-api
  • org.junit.jupiter:junit-jupiter-engine
  • org.junit.jupiter:junit-jupiter-params
  • org.twdata.maven:mojo-executor 2.4.0
  • xml-apis:xml-apis
  • com.jcabi:jcabi-matchers test
  • org.apache.commons:commons-lang3 3.12.0 test
  • org.apache.maven.plugin-testing:maven-plugin-testing-harness 3.3.0 test
  • org.apache.maven:maven-compat 3.8.7 test
  • org.eolang:eo-runtime 0.28.17 test
  • org.yaml:snakeyaml test
eo-parser/pom.xml maven
  • com.google.code.findbugs:annotations
  • com.jcabi.incubator:xembly
  • com.jcabi:jcabi-log
  • com.jcabi:jcabi-manifests 1.2.1
  • com.jcabi:jcabi-xml
  • com.yegor256:xsline
  • net.sf.saxon:Saxon-HE
  • org.antlr:antlr4-runtime
  • org.apache.commons:commons-text 1.10.0
  • org.cactoos:cactoos
  • org.eolang:jucs
  • org.eolang:xax
  • org.junit-pioneer:junit-pioneer
  • org.junit.jupiter:junit-jupiter-api
  • org.junit.jupiter:junit-jupiter-params
  • org.projectlombok:lombok
  • org.yaml:snakeyaml
  • xml-apis:xml-apis
  • com.jcabi:jcabi-matchers test
  • commons-io:commons-io test
  • log4j:log4j test
  • org.slf4j:slf4j-reload4j test
eo-runtime/pom.xml maven
  • org.junit-pioneer:junit-pioneer
  • org.junit.jupiter:junit-jupiter-api
  • org.junit.jupiter:junit-jupiter-params
  • ch.qos.logback:logback-classic 1.4.5 test
  • com.jcabi:jcabi-log test
  • org.cactoos:cactoos test
  • org.llorllale:cactoos-matchers 0.25 test
  • org.slf4j:jul-to-slf4j 2.0.6 test
  • org.slf4j:slf4j-api 2.0.6 test
pom.xml maven
  • com.google.code.findbugs:annotations 3.0.1u2 provided
  • org.projectlombok:lombok 1.18.24 provided
  • com.jcabi.incubator:xembly 0.28.1
  • com.jcabi:jcabi-log 0.22.0
  • com.jcabi:jcabi-matchers 1.6.0
  • com.jcabi:jcabi-xml 0.27.2
  • com.yegor256:xsline 0.20.1
  • commons-io:commons-io 2.11.0
  • log4j:log4j 1.2.17
  • net.sf.saxon:Saxon-HE 12.0
  • org.antlr:antlr4-runtime 4.11.1
  • org.cactoos:cactoos 0.55.0
  • org.slf4j:slf4j-reload4j 2.0.6
  • org.yaml:snakeyaml 1.33
  • xml-apis:xml-apis 2.0.2
  • org.eolang:jucs 0.2.0 test
  • org.eolang:xax 0.0.5 test
  • org.junit-pioneer:junit-pioneer 1.9.1 test
  • org.junit.jupiter:junit-jupiter-api 5.9.2 test
  • org.junit.jupiter:junit-jupiter-engine 5.9.2 test
  • org.junit.jupiter:junit-jupiter-params 5.9.2 test
  • org.junit:junit-bom 5.9.2 test
.github/workflows/daily.yml actions
  • actions/cache v3 composite
  • actions/checkout 3df4ab11eba7bda6032a0b82a6bb43b11571feac composite
  • teatimeguest/setup-texlive-action v2.6.2 composite
.github/workflows/ebnf.yml actions
  • JamesIves/github-pages-deploy-action v4.4.3 composite
  • actions/cache v3 composite
  • actions/checkout 3df4ab11eba7bda6032a0b82a6bb43b11571feac composite
  • actions/setup-java v3 composite
  • teatimeguest/setup-texlive-action v2.6.2 composite
.github/workflows/gpt-code-review.yml actions
  • actions/checkout 3df4ab11eba7bda6032a0b82a6bb43b11571feac composite
  • actions/setup-node v3 composite
.github/workflows/sonar.yml actions
  • actions/cache v3 composite
  • actions/checkout 3df4ab11eba7bda6032a0b82a6bb43b11571feac composite
  • actions/setup-java v3 composite
  • teatimeguest/setup-texlive-action v2.6.2 composite
.github/workflows/up.yml actions
  • actions/checkout 3df4ab11eba7bda6032a0b82a6bb43b11571feac composite
  • peter-evans/create-pull-request v5 composite
eo-maven-plugin/src/it/custom_goals/pom.xml maven
eo-maven-plugin/src/it/duplicate_classes/pom.xml maven
  • org.junit.jupiter:junit-jupiter-api
  • org.junit.jupiter:junit-jupiter-engine
  • org.junit.jupiter:junit-jupiter-params
eo-maven-plugin/src/it/fibonacci/pom.xml maven
eo-maven-plugin/src/it/simple/pom.xml maven
.github/workflows/simian.yml actions
  • actions/checkout b4ffde65f46336ab88eb53be808477a3936bae11 composite
  • actions/setup-java v4 composite
eo-runtime/src/main/rust/eo/Cargo.toml cargo
eo-maven-plugin/src/it/hash_package_layer/pom.xml maven
  • org.apache.maven.plugins:maven-resources-plugin 3.3.1
  • org.eolang:eo-maven-plugin @project.version@
eo-maven-plugin/src/it/rewritten_sources/pom.xml maven
  • org.junit.jupiter:junit-jupiter-api 5.10.1 test
  • org.junit.jupiter:junit-jupiter-params 5.10.1 test