We are currently working on new rules for what content should and shouldn't be allowed on this website, and are looking for feedback! See Esolang:2026 topicality proposal to view and give feedback on the current draft.
Evalsfuck

Pronounced as evil-as-fuck.
Lisp is good. But you know what? Not good enough. Now it’s better than ever.
Evalsfuck is a joke language/esolang that shares a similar concept to Brainfuck. But the difference is that evalsfuck does not fuck with Turing machines. Evalsfuck fucks with pure untyped lambda calculus in the most obnoxious and chaotic way possible.
The language is currently implemented as a reference interpreter written in Haskell. (See #External resources)
Features
Absolutely, purely Turing complete. Evalsfuck is so powerful that it is mathematically as powerful as every programming language you can think of.
No type system. Because fuck you, we’re doing pure computations. Roll your own Church encoding from scratch, that’s what we call FREEDOM.
No control flow. Goodluck writing yet another Y-Combinator.
Strict prefix notation. So printing your evalsfuck code doesn’t waste hundreds of pages on closing parentheses. Making Evalsfuck a more eco-friendly programming language than any lisp dialect.
No error handling. Your code either reduces to normal form, or it won’t stop doing so until your machine begins to burn.
A standardization committee nobody gives a fuck about.
Anything this standard (i.e. this document) doesn’t mention is left entirely to the implementation’s free will. Which is why Evalsfuck currently has over 67 competing dialects and counting.
No packages, no package managers, yet still extendable. Making Evalsfuck the first modern language in history to fully solve the dependency problem.
Forget about hygienic macro-introducing TOXIC MACRO that literally intoxicates your code.
Online statistics, achievements and leaderboards of your code! (Not yet standardised)
Definitions
Evalsfuck uses prefix notation. Evalsfuck code is made of symbols, and a symbol has exactly three forms.
Any valid Evalsfuck source file is one single reducible symbol.
Symbols
A symbol is either a variable, a function, or an application.
Variables
Any string of arbitrary length consisting only of ASCII English letters, which must end with ,.
abcd,, x,, y, are all valid variables.
*s, s*a, are not valid variables.
x,y, is two variables.
Functions
A function definition looks like ?x,x,. A function always consumes the variable after it plus one arbitrary symbol to form a function definition.
Applications
An application looks like .a,b,. An application always consumes the two arbitrary symbols after it, applying the former to the latter.
Meta definition
The descriptions above are for intuition only. The EBNF definition of Evalsfuck is as follows:
expression = variable
| "?" , variable , expression
| "." , expression , expression ;
variable = letter , { letter } , "," ;
letter = "A" | "B" | "C" | "D" | "E" | "F" | "G"
| "H" | "I" | "J" | "K" | "L" | "M" | "N"
| "O" | "P" | "Q" | "R" | "S" | "T" | "U"
| "V" | "W" | "X" | "Y" | "Z"
| "a" | "b" | "c" | "d" | "e" | "f" | "g"
| "h" | "i" | "j" | "k" | "l" | "m" | "n"
| "o" | "p" | "q" | "r" | "s" | "t" | "u"
| "v" | "w" | "x" | "y" | "z" ;
Additionally, any whitespace (spaces, tabs, newlines, carriage returns) is silently ignored. You may add parentheses, but ( and ) are treated as whitespace.
IO
Evalsfuck supports IO in a very special way.
A $ may be inserted anywhere in your evalsfuck code. Before the program runs, it is directly replaced via stdin (sequentially — each $ reads one line and replaces it; on EOF the remaining $s are deleted, and interpretation starts). Yes, in-place text expansion. Wilder than C macros. Evalsfuck’s eval is more eval than PHP’s eval. You can insert literally anything, because at this stage the code is processed as pure text. You can insert broken things, new code, even right in the middle of a variable name… There are no hygienic macros here. Only TOXIC MACROS.
And yes, you can put another $ in your input — after every insertion, the interpreter must check for new $s, and if there are any, keep reading the next line of stdin. $ is not part of the syntax tree and never survives into interpretation.
Evalsfuck prints the normal form obtained by β-reduction to stdout as valid evalsfuck source code. And thanks to the halting problem, your code may very well not have a normal form.
So in practice, you can pipe many evalsfuck programs together. This is called modularity. BRAVO.
Details
A function consumes exactly one variable and one arbitrary symbol.
?x,x, in S-expression terms is (lambda (x) x).
?x,.x,x, means (lambda (x) (x x)).
An application strictly consumes two symbols.
..x,y,z, means ((x y) z).
.?x,x,?y,y, means (lambda (x) x) (lambda (y) y).
The Evalsfuck Standardisation Committee believes it has grasped the Church–Rosser theorem, and as a result the standard does not specify a reduction strategy. Evalsfuck implementations may pick between applicative order and normal order. However, most sane implementations reinforce Normal Order.
The Evalsfuck standard does not define how α-conversion is implemented, so implementations generally just use De Bruijn indices to deal with capture, and restore free-variable names on output. Why? Because I ran out of shits to make up. Macro expansion happens before indexing, of fucking course.
Speaking of preprocessing…
Experimental features
The first character of an evalsfuck program (as long as it’s not a character that could appear in code) acts as the interpreter flag. Of course, the actual specification has to wait for the yet-to-be-released ESC 1000/CD Amd 67:2026 - Evalsfuck the Programming Language (EF2030 for short). There is currently no unified implementation of this feature, but according to the draft still under discussion, there is rough consensus on the following:
@means the interpreter outputs the normal form as a decimal integer — the Church numeral, as defined by Church encoding. How to handle decimals is still a matter of considerable controversy that may never be resolved.#means the interpreter outputs the normal form as a string. Naturally, evalsfuck is so free that strings have no unified definition at all. Two schemes are at loggerheads: one interprets a string as a Church list of Church numerals decoded as an ASCII sequence; the other factorises one giant Church numeral into prime factors, where the exponent of the n-th prime is the ASCII code of the n-th character. The former mocks the latter for being unable to produce any working implementation, while the latter has produced an implementation the community still cannot comprehend — it works, yet cannot be made sense of by any form of mathematics in our reality.^is not defined, and never will be. Mainstream implementations first used it as a marker meaning “use normal order”, while another very popular implementation makes every?in the code have a 5% chance of becoming..酶has no meaning. The canonical pronunciation is /ø/.- The interpreter flag is not part of the syntax tree, so the committee has yet to reach consensus on whether source files even need to be ASCII.
Extra implementation details
- Some interpreters ship with an optional achievement system that streams metrics — symbol count, runtime, memory usage, etc. — to a public API in real time (optionally anonymous), unlocking achievements and joining leaderboards. But even if you opt out, the telemetry won’t stop; good thing it’s anonymous, and it helps us improve our product™.
- The implementation of the large-number prime factorisation algorithm was eventually deleted amid community conflict. The frontiers of mathematical academia are still secretly studying it.
Committee
The Evalsfuck Standardisation Committee consists only of CS freshmen who just took CS101 (even though most of them either failed or just pretended to be undergraduates at all). Every member has a veto for the sake of democracy, so nothing has ever been passed at the time being. Only drafts made their way to the public, which doesn't require voting at all, for members can just overwrite others' drafts. So there were about a hundred different, contradicting drafts proposed every single day. Most of the dialects are founded by former or even existing members of the committee claiming to be the "better evalsfuck"; at least, about 90% of the dialects named themselves after it.
Example
A Evalsfuck program printing Hello World! using # flag enabled is as follows:
#?cons,?nil,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,nil,
Additionally, you can modularise the code. Create two files, in this case, as follows:
helloworld.ef
?cons,?nil,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,..cons,?f,?x,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,.f,x,nil,
print.ef
#$
Then pipe the code together
$ evalsfuck ./helloworld.ef | evalsfuck ./print.ef
External resources
Github repository of the language (including the reference implementation)