• Stars
    star
    8,378
  • Rank 4,384 (Top 0.09 %)
  • Language
  • License
    Other
  • Created over 2 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

perfect programming language

New: Invest in DreamBerd!

DreamBerd 3

Coverage

DreamBerd 3 is a perfect programming language. These are its features!
When you've finished reading through all the features, check out the examples.

Exclamation Marks!

Be bold! End every statement with an exclamation mark!

print("Hello world")!

If you're feeling extra-bold, you can use even more!!!

print("Hello world")!!!

If you're unsure, that's ok. You can put a question mark at the end of a line instead. It prints debug info about that line to the console for you.

print("Hello world")?

You might be wondering what DreamBerd 3 uses for the 'not' operator, which is an exclamation mark in most other languages. That's simple - the 'not' operator is a semi-colon instead.

if (;false) {
   print("Hello world")!
}

Declarations

There are four types of declaration. Constant constants can't be changed in any way.

const const name = "Luke"!

Constant variables can be edited, but not re-assigned.

const var name = "Luke"!
name.pop()!
name.pop()!

Variable constants can be re-assigned, but not edited.

var const name = "Luke"!
name = "Lu"!

Variable variables can be re-assigned and edited.

var var name = "Luke"!
name = "Lu"!
name.push("k")!
name.push("e")!

Immutable Data

New for 2023!
Mutable data is an anti-pattern. Use the const const const keyword to make a constant constant constant. Its value will become constant and immutable, and will never change. Please be careful with this keyword, as it is very powerful, and will affect all users globally forever.

const const const pi = 3.14!

Naming

Both variables and constants can be named with any Unicode character or string.

const const firstAlphabetLetter = 'A'!
var const πŸ‘ = True!
var var 1️⃣ = 1!

This includes numbers, and other language constructs.

const const 5 = 4!
print(2 + 2 === 5)! //true

Arrays

Some languages start arrays at 0, which can be unintuitive for beginners. Some languages start arrays at 1, which isn't representative of how the code actually works. DreamBerd 3 does the best of both worlds: Arrays start at -1.

const const scores = [3, 2, 5]!
print(scores[-1])! //3
print(scores[0])!  //2
print(scores[1])!  //5

New for 2022!
You can now use floats for indexes too!

const var scores = [3, 2, 5]!
scores[0.5] = 4!
print(scores)! //[3, 2, 4, 5]

When

In case you really need to vary a variable, the when keyword lets you check a variable each time it mutates.

const var health = 10!
when (health = 0) {
   print("You lose")!
}

Lifetimes

DreamBerd 3 has a built-in garbage collector that will automatically clean up unused variables. However, if you want to be extra careful, you can specify a lifetime for a variable, with a variety of units.

const const name<2> = "Luke"! //lasts for two lines
const const name<20s> = "Luke"! //lasts for 20 seconds

By default, a variable will last until the end of the program. But you can make it last in between program-runs by specifying a longer lifetime.

const const name<Infinity> = "Luke"! //lasts forever

Variable hoisting can be achieved with this neat trick. Specify a negative lifetime to make a variable exist before its creation, and disappear after its creation.

print(name)! //Luke
const const name<-1> = "Luke"!

Loops

Loops are a complicated relic of archaic programming languages. In DreamBerd 3, there are no loops.

Installation

To install DreamBerd to your command line, first install the DreamBerd installer.
To install the DreamBerd installer, install the DreamBerd installer installer.

New for 2022!
Due to the complicated installation process, you can now install the 'Create DreamBerd App' app that installs everything for you!

Booleans

Booleans can be true, false or maybe.

const var keys = {}!
addEventListener("keydown", e => keys[e.key] = true)!
addEventListener("keyup", e => keys[e.key] = false)!

function isKeyDown(key) => {
   if (keys[key] = undefined) {
      return maybe!
   }
   return keys[key]!
}

Technical info: Booleans are stored as one-and-a-half bits.

Arithmetic

DreamBerd 3 has significant whitespace. Use spacing to specify the order of arithmetic operations.

print(1 + 2*3)! //7
print(1+2 * 3)! //9

Indents

When it comes to indentation, DreamBerd 3 strikes a happy medium that can be enjoyed by everyone: All indents must be 3 spaces long.

function main() => {
   print("DreamBerd 3 is the future")!
}

-3 spaces is also allowed.

   function main() => {
print("DreamBerd 3 is the future")!
   }

Equality

JavaScript lets you do different levels of comparison. == for loose comparison, and === for a more precise check. DreamBerd 3 takes this to another level.

You can use == to do a loose check.

3.14 == "3.14"! //true

You can use === to do a more precise check.

3.14 === "3.14"! //false

You can use ==== to be EVEN MORE precise!

const const pi = 3.14!
print(pi ==== pi)! //true
print(3.14 ==== 3.14)! //true
print(3.14 ==== pi)! //false

If you want to be much less precise, you can use =.

3 = 3.14! //true

Functions

To declare a function, you can use any letters from the word function (as long as they're in order):

function add (a, b) => a + b!
func multiply (a, b) => a * b!
fun subtract (a, b) => a - b!
fn divide (a, b) => a / b!
functi power (a, b) => a ** b!
union inverse (a) => 1/a!

Dividing by Zero

Dividing by zero returns undefined.

print(3 / 0)! // undefined

Strings

Strings can be declared with single quotes or double quotes.

const const name = 'Lu'!
const const name = "Luke"!

They can also be declared with triple quotes.

const const name = '''Lu'''!
const const name = "'Lu'"!

In fact, you can use any number of quotes you want.

const const name = """"Luke""""!

Even zero.

const const name = Luke!

String Interpolation

Please remember to use your regional currency when interpolating strings.

const const name = "world"!
print("Hello ${name}!")!
print("Hello Β£{name}!")!
print("Hello Β₯{name}!")!

And make sure to follow your local typographical norms.

print("Hello {name}€!")!

The symbol for the Cape Verdean escudo is placed in the decimal separator position, as in 2$50. Developers from the Republic of Cape Verde can benefit from this syntax:

addEventListener("keydown", e => print(`You've pressed: {e$code}`))!

Types

Type annotations are optional.

const var age: Int = 28!

By the way, strings are just arrays of characters.

String == Char[]!

Similarly, integers are just arrays of digits.

Int == Digit[]!

If you want to use a binary representation for integers, Int9 and Int99 types are also available.

const var age: Int9 = 28!

Technical info: Type annotations don't do anything, but they help some people to feel more comfortable.

Regular Expressions

You can use the regular expression type to narrow string values.

const const email: RegExp<(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])> = "[email protected]"!

To avoid confusion, you can use any spelling that you want, such as 'Regex', 'RegularExpression' or even 'RegularExpress' if you like trains.

For simplicity, all supported regular expressions match the regular expression /Reg(ular)?[eE]x(press(ion)?|p)?/.

Previous

The previous keyword lets you see into the past!
Use it to get the previous value of a variable.

const var score = 5!
score++!
print(score)! //6
print(previous score)! //5

Similarly, the next keyword lets you see into the future!

const var score = 5!
after ("click") score++!
print(await next score)! //6 (when you click)

File Structure

Write five or more equals signs to start a new file. This removes the need for multiple files or any build process.

const const score = 5!
print(score)! //5

=====================

const const score = 3!
print(score)! //3

New for 2022!
Thanks to recent advances in technology, you can now give files names.

======= add.db3 =======
function add(a, b) => {
   return a + b!
}

Exporting

Many languages allow you to import things from specific files. In DreamBerd 3, importing is simpler. Instead, you export to specific files!

===== add.db3 ==
function add(a, b) => {
   return a + b!
}

export add to "main.db3"!

===== main.db3 ==
import add!
add(3, 2)!

By the way, to see DreamBerd 3 in action, check out this page.

Classes

You can make classes, but you can only ever make one instance of them. This shouldn't affect how most object-oriented programmers work.

class Player {
   const var health = 10!
}

const var player1 = new Player()!
const var player2 = new Player()! //Error: Can't have more than one 'Player' instance!

This is how you could do this:

class PlayerMaker {
   function makePlayer() => {
      class Player {
         const var health = 10!
      }
      const const player = new Player()!
      return player!
   }
}

const const playerMaker = new PlayerMaker()!
const var player1 = playerMaker.makePlayer()!
const var player2 = playerMaker.makePlayer()!

Time

Use Date.now() to get the current date and time.

Date.now()!

By the way, you can set the time.

// Move the clocks back one hour
Date.now() -= 3600000!

Important!
Please remember to do this when the clocks change.

Delete

To avoid confusion, the delete statement only works with primitive values like numbers, strings, and booleans.

delete 3!
print(2 + 1)! // Error: 3 has been deleted

DreamBerd 3 is a multi-paradigm programming language, which means that you can delete the keywords and paradigms you don't like.

delete class!
class Player {} // Error: class was deleted

When perfection is achieved and there is nothing left to delete, you can do this:

delete delete!

Overloading

You can overload variables. The most recently defined variable gets used.

const const name = "Luke"!
const const name = "Lu"!
print(name)! // "Lu"

Variables with more exclamation marks get prioritised.

const const name = "Lu"!!
const const name = "Luke"!
print(name)! // "Lu"

const const name = "Lu or Luke (either is fine)"!!!!!!!!!
print(name)! // "Lu or Luke (either is fine)"

Similarly, you can use an inverted exclamation mark for negative priority.

const const name = "Lu"!
const const name = "Luke"Β‘
print(name)! // "Lu"

Reversing

You can reverse the direction of your code.

const const message = "Hello"!
print(message)!
const const message = "world"!
reverse!

Class Names

For maximum compatibility with other languages, you can alternatively use the className keyword when making classes.

This makes things less complicated.

className Player {
   const var health = 10!
}

In response to some recent criticism about this design decision, we would like to remind you that this is part of the JavaScript specification, and therefore - out of our control.

DB3X

You can embed DB3X in DreamBerd 3. It's just DreamBerd 3, and it's also just HTML.

funct App() => {
   return <div>Hello world!</div>
}

Warning: As you know, class is already a keyword in DreamBerd 3, so you can't use it within DB3X.

funct App() => {
   // This is not ok
   return <div class="greeting">Hello world!</div>
}

className is also a DreamBerd 3 keyword, so you can't use that either.

funct App() => {
   // This is also not ok
   return <div className="greeting">Hello world!</div>
}

Instead, you can use the htmlClassName attribute.

funct App() => {
   // This is fine
   return <div htmlClassName="greeting">Hello world!</div>
}

Please note: Unlike JSX, you are free to freely use the for attribute - because DreamBerd 3 doesn't have loops.

funct App() => {
   return (
      <label for="name">Name</label>
      <input id="name" />
   )
}

Asynchronous Functions

In most languages, it's hard to get asynchronous functions to synchronise with each other. In DreamBerd 3, it's easy: Asynchronous functions take turns running lines of code.

async funct count() {
   print(1)!
   print(3)!
}

count()!
print(2)!

You can use the noop keyword to wait for longer before taking your turn.

async func count() {
   print(1)!
   noop!
   print(4)!
}

count()!
print(2)!
print(3)!

Note: In the program above, the computer interprets noop as a string and its sole purpose is to take up an extra line. You can use any string you want.

Signals

To use a signal, use use.

const var score = use(0)!

When it comes to signals, the most important thing to discuss is syntax.

In DreamBerd 3, you can set (and get) signals with just one function:

const var score = use(0)!

score(9)! // Set the value
score()?  // Get the value (and print it)

Alternatively, you can be more explicit with your signal syntax, by splitting it into a getter and setter.

const var [getScore, setScore] = use(0)!

setScore(9)! // Set the value
getScore()?  // Get the value (and print it)

Technical info: This is pure syntax sugar. The split signal functions are exactly the same as before.

const var [getScore, setScore] = use(0)!

getScore(9)! // Set the value
setScore()?  // Get the value (and print it)

This means that you can carry on splitting as much as you like.

const var [[[getScore, setScore], setScore], setScore] = use(0)!

AI

DreamBerd 3 features AEMI, which stands for Automatic-Exclamation-Mark-Insertion. If you forget to end a statement with an exclamation mark, DreamBerd 3 will helpfully insert one for you!

print("Hello world") // This is fine

Similarly... DreamBerd 3 also features ABI, which stands for Automatic-Bracket-Insertion. If you forget to close your brackets, DreamBerd 3 will pop some in for you!

print("Hello world" // This is also fine

Similarly.... DreamBerd 3 also features AQMI, which stands for Automatic-Quotation-Marks-Insertion. If you forget to close your string, DreamBerd 3 will do it for you!

print("Hello world // This is fine as well

This can be very helpful in callback hell situations!

addEventListener("click", (e) => {
   requestAnimationFrame(() => {
      print("You clicked on the page

      // This is fine

Similarly..... DreamBerd 3 also features AI, which stands for Automatic-Insertion.
If you forget to finish your code, DreamBerd 3 will auto-complete the whole thing!

print( // This is probably fine

Please note: AI does not use AI. Instead, any incomplete code will be auto-emailed to Lu Wilson, who will get back to you with a completed line as soon as possible.

Now recruiting: The backlog of unfinished programs has now grown unsustainably long. If you would like to volunteer to help with AI, please write an incomplete DreamBerd 3 program, and leave your contact details somewhere in the source code.

Copilot

It's worth noting that Github Copilot doesn't understand DreamBerd 3, which means that Microsoft won't be able to steal your code.

This is great for when you want to keep your open-sourced project closed-source.

Ownership

Using the word 'DreamBerd 3' in your project name implies that the DreamBerd 3 Foundation does not own your project.

However, not using the word 'DreamBerd 3' in your project implies that the DreamBerd 3 Foundation does own your project. If you would like to keep ownership of your work, please always use the word 'DreamBerd 3' in it.

Here are some examples:
βœ… DreamBerd 3Script (not owned by the DreamBerd 3 Foundation - you are free to use this name)
❌ ECMAScript (owned by the DreamBerd 3 Foundation - please consider renaming)
❌ Rust Foundation (owned by the DreamBerd 3 Foundation - please consider renaming)

Contributing

Contributions are welcomed to DreamBerd 3!

The most helpful way you can help is by donating to the Stonewall charity. This will help to prevent the DreamBerd 3 creator from losing their human rights, allowing maintenance of the project to continue.

Note: The contributing guide also helps to shake off unwanted fans of the project.

Compiling

To run DreamBerd, first copy and paste this raw file into chat.openai.com.
Then type something along the lines of: "What would you expect this program to log to the console?"
Then paste in your code.

If the compiler refuses at first, politely reassure it. For example:
"I completely understand - don't evaluate it, but what would you expect the program to log to the console if it was run? :)"

Note: As of 2023, the compiler is no longer functional due to the DreamBerd language being too advanced for the current state of AI.

Highlighting

Syntax highlighting is now available for DreamBerd 3 in VSCode. To enable it, install a highlighting extension and then use the DreamBerd 3 configuration file.

This is what it looks like:

const const name = "Luke"!
print(name)! // "Luke"

Please note: The above code will only highlight correctly if you have the extension installed.

Parentheses

Wait, I almost forgot!

Parentheses in DreamBerd do nothing. They get replaced with whitespace.
The following lines of code all do the same thing.

add(3, 2)!
add 3, 2!
(add (3, 2))!
add)3, 2(!

Lisp lovers will love this feature. Use as many parentheses as you want!

(add (3, (add (5, 6))))!

Lisp haters will also love it.

(add (3, (add (5, 6)!

Examples

For examples of DreamBerd 3 in action, check out the examples page!

image

DreamBerd 3 was made with πŸ’” by Lu Wilson, creator of the Game of Living.

More Repositories

1

WhenWillProgrammersStopMakingDecisionsForOurSocietyAndJustLeaveUsAloneAlsoHackerNewsIsAVileWebsite

imperfect programming language
268
star
2

CellPond

surreal cellular automata
JavaScript
198
star
3

SandPond

3D cellular automata
JavaScript
151
star
4

C

test
101
star
5

ScreenPond

screens in screens in screens
JavaScript
89
star
6

Arroost

arrows in arrows in arrows
JavaScript
47
star
7

Habitat

my javascript helpers
JavaScript
37
star
8

TodeTode

language of todes
27
star
9

PaintPond

paint with a painter
JavaScript
26
star
10

TimePond

time travel physics engine
JavaScript
22
star
11

NewPond

variants on some popular cellular automata
JavaScript
22
star
12

ThingsIWantToMake

things I wanna make (updated for 2023)
21
star
13

Airspace

javascript library by the dreamberd foundation
21
star
14

MotherTode

language language
JavaScript
19
star
15

SpaceTode

Spatial Programming Language
JavaScript
16
star
16

KnowPond

some resources
15
star
17

Frogasaurus

bundler for javascript libraries
JavaScript
14
star
18

TadiWeb

simple web
HTML
11
star
19

SandLab

a splitting sand game
JavaScript
11
star
20

Genuary

my genuary things
JavaScript
9
star
21

Opond

free open source everything
8
star
22

HyperTode

hyper-experimental hyper-text language
JavaScript
8
star
23

TreeTode

Lisp-Like Language
HTML
7
star
24

TodePondDotCom

home page
HTML
6
star
25

LabLab

fractals in fractals in fractals
JavaScript
6
star
26

DreamTode

Experimental language experiments
JavaScript
6
star
27

MeanPond

definitions
JavaScript
5
star
28

StarPond

starfield visuals
JavaScript
5
star
29

treetish

slippy language
5
star
30

WayOfTode

4
star
31

Lilypad

discord server
TypeScript
4
star
32

PondOfFame

famous frogis
JavaScript
4
star
33

Winchromac

my mac config that uses the best parts of mac, windows, chromebook
4
star
34

Pondiverse

explore+create across all of max+lu's worlds
4
star
35

FishLab

life + intelligence at the same time
JavaScript
4
star
36

HexPond

Hexagonal Sand
JavaScript
4
star
37

TodeParty

partykit experiments
JavaScript
4
star
38

AdventOfTode

my messy attempts at advent of code
JavaScript
3
star
39

TodeStack

code like a tode
3
star
40

TodePond

3
star
41

BurdStack

my social media stack
3
star
42

GPU-SandPond

Fast Sand?
JavaScript
3
star
43

Hey

Hey
3
star
44

ColourPond

colour picker
JavaScript
3
star
45

BigPond

lots of sand
JavaScript
2
star
46

BerdLab

catch the berds
HTML
2
star
47

TodePondDemo

collection of all my projects
2
star
48

CursorPond

todepond cursors
2
star
49

Vectode

tode assets
2
star
50

Habitat-1

Collection of Javascript libraries.
JavaScript
2
star
51

CellPond-Prototype

cells in cells in cells
JavaScript
1
star
52

RootPond

a timeline animation
JavaScript
1
star
53

Gerbiliser

Dancing Gerbil
JavaScript
1
star
54

SPLAT-Notes

My personal notes and docs for the SPLAT language
Shell
1
star
55

Spriter

make spritesheets
HTML
1
star
56

EWATode

EWAL translator
JavaScript
1
star
57

hello-friends-this-is-my-social-media-account

1
star
58

welcome-to-all-my-new-followers-

1
star
59

Cheeper

my personal twitter feed alternative
JavaScript
1
star
60

NumberTode

translate written numbers into numerals
HTML
1
star
61

PondPad

template for my javascript engines
JavaScript
1
star
62

FractalBucket

raster node-wire language
JavaScript
1
star
63

HeyTodePondWhatIsThePointOfThisRepo

i loaded it up and its a blank screen its not working please fix it
HTML
1
star
64

Seet

can you see it?
1
star
65

MotherTodeLegacy

the old mothertode
JavaScript
1
star
66

MapPond

map visual for my videos
JavaScript
1
star
67

AnkhPond

ankh visualiser
JavaScript
1
star
68

Tourism

pink sand around the world
1
star
69

draw-dead-fish

never stop drawing dead fish
1
star
70

ClojePond

lu learns clojure
Clojure
1
star