Science Score: 54.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 -
○Academic email domains
-
○Institutional organization owner
-
○JOSS paper metadata
-
○Scientific vocabulary similarity
Low similarity (9.0%) to scientific vocabulary
Repository
Basic Info
- Host: GitHub
- Owner: jenna-aspecta
- License: mit
- Language: Java
- Default Branch: main
- Size: 201 KB
Statistics
- Stars: 9
- Watchers: 1
- Forks: 0
- Open Issues: 0
- Releases: 0
Metadata Files
README.md
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) - syntactic sugar (why?)
Quick Start
First, install Java SE, npm, Rust with Cargo and eoc.
Then, start with a simple EO program in app.eo file:
[args...] > app
QQ.io.stdout > @
"Hello, world!\n"
Compile it like this (may take a minute or so):
eoc link
Then, run it:
eoc --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 got 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 requirement arguments provided.
This is how a copy of the object stdout is made:
QQ.io.stdout
"Hello, world!"
The indentation in EO is important, just like in Python. There have to 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:
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:
[] > 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:
``` +alias org.eolang.io.stdout +alias org.eolang.txt.sprintf
[] > 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:
[] > 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:
[args...] > app
memory 0 > x
seq > @
*
x.write 2
while.
x.lt 6
[i]
seq > @
*
QQ.io.stdout
QQ.txt.sprintf
"%d x %d = %d\n"
x
x
x.times x
x.write
x.plus 1
true
This code will print this:
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:

This is the EBNF of 𝜑-calculus:

The images were auto-generated. It's better to use ebnf/Eo.svg and ebnf/Phi.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.
See the full collection of canonical objects: objectionary.
Take a look how we use EO as an Intermediary Representation (IR) in Polystat, a polyglot static analyzer.
Play with more examples here.
Read about integration with Maven, here.
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 8+ installed.
Special thanks
We are using the YourKit Java Profiler to enhance the performance of EO components:
Owner
- Login: jenna-aspecta
- Kind: user
- Repositories: 1
- Profile: https://github.com/jenna-aspecta
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" 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"
GitHub Events
Total
Last Year
Dependencies
- com.jcabi:jcabi-maven-slf4j 0.12.2 compile
- net.sf.saxon:Saxon-HE compile
- javax.json:javax.json-api 1.1.4 provided
- org.apache.maven.plugin-tools:maven-plugin-annotations 3.13.1 provided
- org.apache.maven:maven-core 3.9.8 provided
- org.apache.maven:maven-model 3.9.8 provided
- org.apache.maven:maven-plugin-api 3.9.7 provided
- org.slf4j:slf4j-reload4j 2.0.13 provided
- ch.qos.reload4j:reload4j 1.2.25
- com.google.code.findbugs:annotations
- com.jcabi.incubator:xembly
- com.jcabi:jcabi-aspects 0.26.0
- com.jcabi:jcabi-log
- com.jcabi:jcabi-manifests
- com.jcabi:jcabi-xml
- com.moandjiezana.toml:toml4j 0.7.2
- com.opencsv:opencsv 5.9
- com.yegor256:jaxec
- com.yegor256:jhome
- com.yegor256:jping
- com.yegor256:tojos 0.18.1
- com.yegor256:xsline
- commons-codec:commons-codec 1.17.1
- commons-io:commons-io 2.16.1
- org.antlr:antlr4-runtime
- org.apache.commons:commons-lang3 3.15.0
- org.aspectj:aspectjrt 1.9.22.1
- org.cactoos:cactoos
- org.codehaus.plexus:plexus-utils 3.5.1
- 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.maven.plugin-testing:maven-plugin-testing-harness 3.3.0 test
- org.apache.maven:maven-compat 3.9.8 test
- org.yaml:snakeyaml test
- org.projectlombok:lombok 1.18.34 provided
- com.google.code.findbugs:annotations
- com.jcabi.incubator:xembly
- com.jcabi:jcabi-log
- com.jcabi:jcabi-manifests
- com.jcabi:jcabi-xml
- com.yegor256:xsline
- net.sf.saxon:Saxon-HE
- org.antlr:antlr4-runtime
- org.apache.commons:commons-text
- 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.yaml:snakeyaml
- xml-apis:xml-apis
- com.jcabi:jcabi-matchers test
- commons-io:commons-io test
- log4j:log4j test
- org.slf4j:slf4j-reload4j test
- ch.qos.logback:logback-classic 1.5.5 test
- com.google.guava:guava test
- com.jcabi:jcabi-log test
- com.jcabi:jcabi-xml test
- com.yegor256:farea 0.0.17 test
- com.yegor256:jaxec test
- com.yegor256:jhome test
- com.yegor256:jping test
- net.sf.saxon:Saxon-HE test
- org.cactoos:cactoos test
- org.eolang:jucs test
- org.junit-pioneer:junit-pioneer test
- org.junit.jupiter:junit-jupiter-api test
- org.junit.jupiter:junit-jupiter-params test
- org.llorllale:cactoos-matchers 0.25 test
- org.slf4j:jul-to-slf4j 2.0.13 test
- org.slf4j:slf4j-api 2.0.13 test
- org.yaml:snakeyaml test
