excela
Jump to navigation
Jump to search
excela represents a paradigm of relative programming. Everything in excela is variable. Surprisingly, it's Turing-complete. Because excela is a complex language, versions are complex numbers.
The name "excela" has its origin in "Microsoft Excel", which the language resembles. It shares the file suffixes .xls and .doc, too.
Grammar
A program consists of a set of Ruby assignments. Internally excela repeatedly performs all the assignments in an unspecified order, as long as something is changing.
Uses
- Distributed algorithms.
- Obfuscation for describing GUIs; excela is an ideal language for this.
- Solving equations by iterative methods.
Hello world
In a normal language:
puts "Hello world"
In excela:
#helloworld.doc i=126207244316550804821666916 j=10 #helloworld.xls Output[Output[j] ? 1000 : j],i=i%256,i/(Output[j] ? 1 : 256) j= j+((Output[j] && i!=0) ? -1 : 0)
Not so esoteric
The language excela is still not too obfuscated. Proof of this is this excela interpreter in excela:
#excela.doc
value=eval(IO.read(ARGV[1]))
rulez=IO.read(ARGV[0]).split("\n")
c={}
#excela.xls
chg= rulez.inject(nil){|r,w| r||(c[v]!=(c[v]=eval(v))) } ? chg : !chg
And in Ruby:
#this version -3+6i is public domain
#!/usr/bin/ruby
include Math #to sin without math
class Inputer #class which reads input
def initialize() @ar=[] end
def [](a) (@ar<<STDIN.getc while a>=@ar.size ); @ar[a] end #define operator
end #end class
class Outputer #class which writes output
def initialize() @ar=[] @op=0 end #end def
def [](a) @ar[a] end #end def
def []=(a,v) raise "CRITICAL ERROR trying to ReWrItE oUtPuT" if a<@op
@ar[a]=v;((STDOUT.putc @ar[@op];@op+=1)while @ar[@op]) end
end #end class
value=eval(IO.read(ARGV[1])) # get value of file in $
Ring=binding #one ring to bind them all
Rulez=IO.read(ARGV[0]).split("\n") #excela rulez
Input=Inputer.new ; Output=Outputer.new ;change=0
while change #we are applying rules while we are changing anything
change=false #we didnt change anything yet
Rulez.each(){|r|#we didnt change anything yet when we are trying to apply rule r
begin raise "CRUCIAL ERROR -not assigned" if !(/(.*[^!=<>])=[^=]/===r)
rb=eval("["+$1+"]",Ring) ; eval(r,Ring) ; change||=(eval("["+$1+"]",Ring)!=rb) #and here we perhaps noticed that we changed something
rescue puts "something bad with #{r}" #syntax or other error
end } end
External resources
- excela home page (from the Wayback Machine; retrieved on 22 March 2016) (Sadly the implementation has not been archived.)
- [1]