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.
Difficult
Difficult is an esoteric programming language that tries to add every characteristic possible into the concept, making it harder to learn. It is created by User:A.
Documentation
Hello World!
Starting with "Hello world". This is very simple.
thing.console.print("Hello, world")?
Here, "console" is a class (that is not needed yet), and "print" is a method. The method "print" prints a string to the console. Note that commands end in question marks. "thing" is also a class that contains everything.
This is the way to input:
thing.console.Input("This is the input prompt. ")?
Note that "Input" is capitalized, to make it harder to program. :-)
Note that only the "print" and "Input" functions have parentheses-enclosed parameters. Other function have brace-enclosed parameters.
Every escape character in C is supported.
Types
Difficult only has one type. That is the "everything" type. This type will auto-detect the value.
Setting variables
You can directly use a variable. It is set to 0.
Use the "=" operator. This sets a variable to a value.
`This is a multi-line
comment`
#This is a comment
#You can set a variable into a string
a="string"?
#Or a number
b=2?
c=3.1?
#The print function supports variable printing.
thing.console.print("*(a) *(b) *(c)")?
Stdout:
string 2 3.1
The *() operator in the string prints a variable instead of a string literal.
If you want to print "*()", then use single quote marks. Single quote marks directly uses the string literal.
console.print('*()')?
You can also set a table.
Numeric table(index starts from 0):
a={1,2,3}?
String-indexed table
a={"one":1,"two":2,"three":3}?
To index:
thing.table.index{a,0}?
To define 2-dimensional tables:
a={{0}}?
thing.table.index{a,0,0}?
Etc. for dimensional arrays more than 2 dimensions.
There is also the len operator, which returns the length of a table.
Other operators
len:table length
+:mathematical plus and string connection operator
-:mathematical minus
*:mathematical multiplication
/:mathematical division
;:mathematical floor division
%:mathematical mod
^:mathematical power
sqrt:mathematical square root
sin:mathematical sine
cos:mathematical cosine
tan:mathematical tangent
abs:mathematical absolute value
max:maximum value
min:minimum value
acos:mathematical acos
asin:mathematical asin
atan:mathematical atan
ceil:mathematical ceil
floor:mathematical floor
log:mathematical log
pi:mathematical pi
random{a,b}:produce a random integer between a and b
exit:quit program
run{a}:run the string a in the standard command-line interpreter.
assert{a}:assert a is true
error{a}:output a in stderr
and:logical and
or:logical or
not:logical not
xor:logical exclusive or
band:bitwise and
bor:bitwise or
bnot:bitwise not
bxor:bitwise exclusive or
nand:logical nand
nor:logical nor
xnor:logical xnor
eq:equal
noteq:not equal
gt:greater than
notgt:less than or equal
ls:less than
notls:greater than or equal
lsh:left shift
rsh:right shift
THESE ARE SET OPERATORS
+= -= *= /= ^= %= ;= max= min= and= or= not= xor= nand= nor= xnor= eq= noteq= ls= notls= gt= notgt= lsh= rsh= ++ --
Control structures
If-else if-else statement
thing.keyword.if condition[
do_something?
]thing.keyword.elseif condition[
do_someOtherThing?
]thing.keyword.else[
else_statement?
]
Shortcut
condition thing.keyword.if do_something thing.keyword.else do_someOtherThing?
This c if a else b statement returns a if c is true. Otherwise, it returns b.
Switch-case statement
thing.keyword.switch a
[
thing.keyword.wheneq 2
[
thing.console.print("a is 2")?
]
thing.keyword.autoMatic
[
thing.console.print("a is not 2")?
]
]
The switch statement above will not fallthrough. To let it fallthrough, change the "switch" to "fswitch".
Goto statement
Just used for writing Spaghetti code.
Begin:
thing.keyword.goto("Begin")?
Also, it supports BASIC-like gotos:
12 thing.keywords.gol(12)?
Loop constructs
Infinite loop
thing.keywords.infiniteLoop
[
thing.console.print("This will output forever")?
]
while
condition=true?
thing.keywords.while condition
[
thing.console.print("this will output forever")?
]
for loop
C-like for loop
thing.keywords.for thing.keywords.start1 condition=true thing.keywords.end1 thing.keywords.start2 condition thing.keywords.end2 thing.keywords.start3 thing.keywords.end3
[
#Try to avoid using it. This for loop is very wordy.
thing.console.print("This will also output forever.")?
]
range-based for loops like C++11 are also supported.
thing.keywords.for start thing.keywords.in {1,2,3}
[
thing.console.print("*(start)")?
]
Stdout:
1 2 3
Also, count controlled loops are supported!
thing.keywords.for i=1 thing.keywords.top 3 #thing.keywords.step 2 : this is optional
[
thing.console.print("*(i)")?
]
Stdout:
1 2 3
do..while and do..until loop
These are similar to the while loops.
Do while loop:
thing.keyword.do[
thing.console.print("this will print")?
] thing.keyword.while condition?
The do-until loop is similar, just substitute while as until.
Early exit from loops
Break statement:thing.keyword.toend
Continue statement:thing.keyword.tobeg
exception handling
thing.keyword.check[
#try
a=0/0?
]thing.keyword.findOut divError[
#except
thing.console.print("There is a division error")?
]thing.keyword.last[
#finally
print("This must be executed")?
]
Functions
procedures
thing.keywords.function a{}
[
thing.console.print("Did this")?
]
a{}?
Stdout:
Did this
functions
#a terrible fib function
thing.keywords.function fib{i}
[
thing.keywords.if (i eq 1) or (i eq 0)
[
thing.keywords.return 1?
]
thing.keywords.return fib{i-1}+fib{i-2}?
]
closure example
things.keyword.function add{a}
[
things.keyword.function clo{b}
[
thing.keywords.return a+b?
]
thing.keywords.return clo?
]
thing.console.print("*(add{1}{2})")?
Stdout:
3
Same example using anonymous functions
thing.keyword.function add{a}
[
thing.keyword.return(
thing.keyword.function{b}
[
return a+b?
]
)?
]
thing.console.print("*(add{1}{2})")?
Objects
thing.keyword.object oriented
[
thing.keyword.function method{a,b}
[
thing.console.print("*(a*b)")?
]
]
oriented.method{1,2}?
Stdout:
2
You can even define anonymous objects!
thing.keyword.object class
[
thing.keyword.object
[
thing.keyword.function method{a}
[
thing.console.print("*(a)")?
]
]
]
class..method{1}?
Stdout:
1
Sub-classes:
thing.keyword.class classsub
[
thing.keyword.function method{a}
[
thing.console.print("*(a)")?
]
]thing.keyword.from class?
Macros
thing.macro.replace a thing.console.print("A")?
a
A
Dynamic macros
thing.macro.dynamicReplace a a
stdin:
thing.console.print("hello, world")?
stdout:
hello, world
File inclusion
thing.include.include a.df #executes a.df before all the code
SKI combinators
I:
thing.ski.directReturn{x}
That is equivalent to x.
K:
thing.ski.ignoreNext{x,y}
That is equivalent to x.
I:
thing.ski.substitute{x,y,z}
that is equivalent to xy(xz).
That is probably enough.
The "thing" library
thing.console.*
| output a string with a newline character | |
| printn | output a string without a newline character |
| printd | example: printd{a} is equal to print("*(a)"). |
| printnd | example: printnd{a} is equal to printn("*(a)"). |
| Input | Input from console with a prompt |
| fprint | print the contents of a file |
| fout | output contents into a file, replacing the original information. |
| foutn | output contents into a file, not replacing the original information. |
| fInput | Input from file |
| setstdin | set the standard input as stdin or a file |
| setstdout | set the standard output as stdout or a file |
thing.*
Everything that is in this documentation.thing.ownSource is also one that represents the current source.
thing.time.*
| time | return an array with numbers representing the year, month, day, hour, minute, and second. |
| time1990 | return a number: the number of seconds since 1990. |
Self-modification
thing.mod.modxin(a,"b")?
Change the source code starting from character a (this starts from 0) while printing prompt "b".
Instruction encipherment/decipherment
Add this. This might produce error messages like "command not found".
#using rot13 enscryption
Substitute "rot13" as any encryption algorithm.
Local variables
A local variable can only be used in a specific part of code.
thing.keyword.local a?
[
#you can only use "a" here
a=1?
thing.console.print("*(a)")?
]
thing.keyword.consume
[
thing.console.print("*(a)")?
]
thing.keyword.findOut undefinedError
[
thing.console.print("variable a is undefined")?
]
Stdout:
1 variable a is undefined
Stacks
thing.stack.stack a?#define a stack called a
thing.stack.push(a,"e")?#push the string "e" into stack a
thing.console.print("*(thing.stack.top(a)?)")?#prints the top value of the stack
thing.stack.pop(a)?#pops the top value of the stack
#thing.stack.size(a) returns the size of stack a
Queues
thing.queue.queue a?#define a queue called a
thing.queue.push(a,"e")?#push the string "e" into queue a
thing.console.print("*(thing.stack.front(a)?)")?#prints the front value of the stack
thing.stack.pop(a)?#pops the front value of the queue
#thing.queue.size(a) returns the size of queue a
Deques
thing.deque.deque a?#define a deque called a
thing.deque.push(a,"e")?#push the string "e" into deque a in the back
thing.deque.pushf(a,"l")?#push the string "l" into deque a in the front
thing.console.print("*(thing.deque.back(a)?)")?#prints the back value of the stack
thing.console.print("*(thing.deque.front(a)?)")?#prints the front value of the stack
thing.deque.pop(a)?#pops the back value of the deque
thing.deque.popf(a)?#pops the front value of the deque
#thing.deque.size(a) returns the size of deque a
Pointers
#define a variable
v=1?
#define a pointer a
thing.pointer.pointer a?
#Set the pointer v as a's place in memory
a=thing.pointer.place(v)?
#output the place where the variable a is saved in
thing.console.output("*(a)")?
#output the value of a in the memory
thing.console.output("*(thing.pointer.savedValue(a))")?
#output the place where the pointer a is saved
thing.console.output("*(thing.pointer.place(a))")?
User-defined types
#to make a type
thing.types.makeType a[
#there are two variables in this type
a,b
#of course you can modify to make it support arrays and stacks and etc.
]?#<-- there is a question make here
#accessing the variables
thing.types.access(a,a)=12?
thing.types.access(a,b)=13?
thing.console.print("*(thing.types.access(a,a))")#--> 12
thing.console.print("*(thing.types.access(a,b))")#--> 13
Computational class
This is Turing complete, because it is an extension of 3-celled Brainfuck with no-I/O, which was already proved to be Turing complete in the Collatz function page.
The variable a can be any of the three of a, b, and c, depending on the current operating variable.
Conversion + a++? - a--? < and > these do not produce code. Instead, they change the currently operating variable. [ thing.keyword.while a[ ] ]
Unfinished list
- Graph re-writing
- Automata rule specification
- typeclasses
- stochastic grammars (context-free at the least)
- qubits