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