Code Monkey home page Code Monkey logo

dreamberd's Introduction

New: Introducing the world's first DreamBerd interpreter

DreamBerd

Coverage

DreamBerd 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 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 letter = '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 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 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, 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 has significant whitespace. Use spacing to specify the order of arithmetic operations.

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

Unlike some other languages, DreamBerd allows you to use the caret (^) for exponentiation.

print(1^1)! // 1
print(2^3)! // 8

You can also use the number name, for example:

print(one+two)! //3

Indents

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

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

-3 spaces is also allowed.

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

Equality

JavaScript lets you do different levels of comparison. == for loose comparison, and === for a more precise check. DreamBerd 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:

const const player = { name: "Lu" }!
print("Hello {player$name}!")!

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!
addEventListener("click", () => score++)!
print(await next score)! //6 (when you click)

Additionally, the current keyword lets you see into the present!!

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

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.db =======
function add(a, b) => {
   return a + b!
}

Exporting

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

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

export add to "main.db"!

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

By the way, to see DreamBerd 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 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"

Semantic naming

DreamBerd supports semantic naming.

const const sName = "Lu"!
const const iAge = 29!
const const bHappy = true!

New for 2023: You can now make globals.

const const g_fScore = 4.5!

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.

DBX

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

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

Warning: As you know, class is already a keyword in DreamBerd, 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 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 doesn't have loops.

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

Rich text

DreamBerd now supports rich text.

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

print(name)! // Lu
print(name)! // Luke

Rich text can be helpful when making your website. Use it to add links!

<p>Click here</p>

Asynchronous Functions

In most languages, it's hard to get asynchronous functions to synchronise with each other. In DreamBerd, 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, 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 features AEMI, which stands for Automatic-Exclamation-Mark-Insertion. If you forget to end a statement with an exclamation mark, DreamBerd will helpfully insert one for you!

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

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

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

Similarly.... DreamBerd also features AQMI, which stands for Automatic-Quotation-Marks-Insertion. If you forget to close your string, DreamBerd 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 also features AI, which stands for Automatic-Insertion.
If you forget to finish your code, DreamBerd 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 program, and leave your contact details somewhere in the source code.

Copilot

It's worth noting that Github Copilot doesn't understand DreamBerd, 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' in your project name implies that the DreamBerd Foundation does not own your project.

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

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

Contributing

If you are an influencer, streamer, or content-creator... you must not skip this section during your read-through.

Contributions are welcomed to DreamBerd!

The most helpful way you can help is by donating to the Stonewall charity. This will help to prevent the DreamBerd 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 in VSCode. To enable it, install a highlighting extension and then use the DreamBerd 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)!

Vision Pro

The DreamBerd Vision Pro is now available! Watch the full launch video here.

Edutainment

Want to learn more about DreamBerd?

Don't check out this tech talk about DreamBerd by DreamBerd creator Lu/Luke Wilson.

Examples

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

image

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

dreamberd's People

Contributors

12emin34 avatar alifeee avatar bocz3k avatar cute-catgirl avatar debitcardz avatar eltociear avatar endermanbugzjfc avatar gearsdatapacks avatar k8skween avatar karolstawowski avatar labbo-lab avatar loglot avatar lysatk avatar maeek avatar magnogen avatar mybearworld avatar naveen17797 avatar pomierski avatar scolsen avatar sgomez avatar simenwol avatar smuglix avatar spdegabrielle avatar spiffytech avatar stohrendorf avatar teijo avatar thegatesdev avatar thejeffreykuo avatar todepond avatar youhavetrouble avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dreamberd's Issues

Suggestion for AI powered Fuzzy standard library function names

I have a bad memory and can never remember common utility function names across various languages so it would be good if all synonyms (or even words close together in semantic space) map to the same function. I call it fuzzy functions or fuzzions.

"hello world".includes("world")! //true
"hello world".has("world")! //true
"hello world".contains("world")! //true
"hello world".substr("world")! //true
"world".isPartOf("hello world")! //true

"hello world".length! //11
"hello world".size! //11
"hello world".howManyCharactersAreInThisString()? //11

to enable this we can use ChatGPT but API calls are too expensive for me. Instead I suggest we use the chat interface which is free. DreamBerd should come bundled with a chrome webdriver. During compilation it will open a new browser window and use puppeteer/playwright/selenium to copy and paste in the function name into chatgpt with the prompt "What do you think this function does based on its name?"

Boolean-not operator feature contains four spaces

Hey. We use DreamBerd in production and we ran into the following problem while trying to resolve a credit card payment (anonymousified):

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

After exhaustively debugging we found that the solution was (again anonymousified)

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

There should be more stars please help!!!!!!!!!!!!!!!!!!!!!!!!

  • 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • 373
  • 374
  • 375
  • 376
  • 377
  • 378
  • 379
  • 380
  • 381
  • 382
  • 383
  • 384
  • 385
  • 386
  • 387
  • 388
  • 389
  • 390
  • 391
  • 392
  • 393
  • 394
  • 395
  • 396
  • 397
  • 398
  • 399
  • 400
  • 401
  • 402
  • 403
  • 404
  • 405
  • 406
  • 407
  • 408
  • 409
  • 410
  • 411
  • 412
  • 413
  • 414
  • 415
  • 416
  • 417
  • 418
  • 419
  • 420
  • 421
  • 422
  • 423
  • 424
  • 425
  • 426
  • 427
  • 428
  • 429
  • 430
  • 431
  • 432
  • 433
  • 434
  • 435
  • 436
  • 437
  • 438
  • 439
  • 440
  • 441
  • 442
  • 443
  • 444
  • 445
  • 446
  • 447
  • 448
  • 449
  • 450
  • 451
  • 452
  • 453
  • 454
  • 455
  • 456
  • 457
  • 458
  • 459
  • 460
  • 461
  • 462
  • 463
  • 464
  • 465
  • 466
  • 467
  • 468
  • 469
  • 470
  • 471
  • 472
  • 473
  • 474
  • 475
  • 476
  • 477
  • 478
  • 479
  • 480
  • 481
  • 482
  • 483
  • 484
  • 485
  • 486
  • 487
  • 488
  • 489
  • 490
  • 491
  • 492
  • 493
  • 494
  • 495
  • 496
  • 497
  • 498
  • 499
  • 500
  • 501
  • 502
  • 503
  • 504
  • 505
  • 506
  • 507
  • 508
  • 509
  • 510
  • 511
  • 512
  • 513
  • 514
  • 515
  • 516
  • 517
  • 518
  • 519
  • 520
  • 521
  • 522
  • 523
  • 524
  • 525
  • 526
  • 527
  • 528
  • 529
  • 530
  • 531
  • 532
  • 533
  • 534
  • 535
  • 536
  • 537
  • 538
  • 539
  • 540
  • 541
  • 542
  • 543
  • 544
  • 545
  • 546
  • 547
  • 548
  • 549
  • 550
  • 551
  • 552
  • 553
  • 554
  • 555
  • 556
  • 557
  • 558
  • 559
  • 560
  • 561
  • 562
  • 563
  • 564
  • 565
  • 566
  • 567
  • 568
  • 569
  • 570
  • 571
  • 572
  • 573
  • 574
  • 575
  • 576
  • 577
  • 578
  • 579
  • 580
  • 581
  • 582
  • 583
  • 584
  • 585
  • 586
  • 587
  • 588
  • 589
  • 590
  • 591
  • 592
  • 593
  • 594
  • 595
  • 596
  • 597
  • 598
  • 599
  • 600
  • 601
  • 602
  • 603
  • 604
  • 605
  • 606
  • 607
  • 608
  • 609
  • 610
  • 611
  • 612
  • 613
  • 614
  • 615
  • 616
  • 617
  • 618
  • 619
  • 620
  • 621
  • 622
  • 623
  • 624
  • 625
  • 626
  • 627
  • 628
  • 629
  • 630
  • 631
  • 632
  • 633
  • 634
  • 635
  • 636
  • 637
  • 638
  • 639
  • 640
  • 641
  • 642
  • 643
  • 644
  • 645
  • 646
  • 647
  • 648
  • 649
  • 650
  • 651
  • 652
  • 653
  • 654
  • 655
  • 656
  • 657
  • 658
  • 659
  • 660
  • 661
  • 662
  • 663
  • 664
  • 665
  • 666
  • 667
  • 668
  • 669
  • 670
  • 671
  • 672
  • 673
  • 674
  • 675
  • 676
  • 677
  • 678
  • 679
  • 680
  • 681
  • 682
  • 683
  • 684
  • 685
  • 686
  • 687
  • 688
  • 689
  • 690
  • 691
  • 692
  • 693
  • 694
  • 695
  • 696
  • 697
  • 698
  • 699
  • 700
  • 701
  • 702
  • 703
  • 704
  • 705
  • 706
  • 707
  • 708
  • 709
  • 710
  • 711
  • 712
  • 713
  • 714
  • 715
  • 716
  • 717
  • 718
  • 719
  • 720
  • 721
  • 722
  • 723
  • 724
  • 725
  • 726
  • 727
  • 728
  • 729
  • 730
  • 731
  • 732
  • 733
  • 734
  • 735
  • 736
  • 737
  • 738
  • 739
  • 740
  • 741
  • 742
  • 743
  • 744
  • 745
  • 746
  • 747
  • 748
  • 749
  • 750
  • 751
  • 752
  • 753
  • 754
  • 755
  • 756
  • 757
  • 758
  • 759
  • 760
  • 761
  • 762
  • 763
  • 764
  • 765
  • 766
  • 767
  • 768
  • 769
  • 770
  • 771
  • 772
  • 773
  • 774
  • 775
  • 776
  • 777
  • 778
  • 779
  • 780
  • 781
  • 782
  • 783
  • 784
  • 785
  • 786
  • 787
  • 788
  • 789
  • 790
  • 791
  • 792
  • 793
  • 794
  • 795
  • 796
  • 797
  • 798
  • 799
  • 800
  • 801
  • 802
  • 803
  • 804
  • 805
  • 806
  • 807
  • 808
  • 809
  • 810
  • 811
  • 812
  • 813
  • 814
  • 815
  • 816
  • 817
  • 818
  • 819
  • 820
  • 821
  • 822
  • 823
  • 824
  • 825
  • 826
  • 827
  • 828
  • 829
  • 830
  • 831
  • 832
  • 833
  • 834
  • 835
  • 836
  • 837
  • 838
  • 839
  • 840
  • 841
  • 842
  • 843
  • 844
  • 845
  • 846
  • 847
  • 848
  • 849
  • 850
  • 851
  • 852
  • 853
  • 854
  • 855
  • 856
  • 857
  • 858
  • 859
  • 860
  • 861
  • 862
  • 863
  • 864
  • 865
  • 866
  • 867
  • 868
  • 869
  • 870
  • 871
  • 872
  • 873
  • 874
  • 875
  • 876
  • 877
  • 878
  • 879
  • 880
  • 881
  • 882
  • 883
  • 884
  • 885
  • 886
  • 887
  • 888
  • 889
  • 890
  • 891
  • 892
  • 893
  • 894
  • 895
  • 896
  • 897
  • 898
  • 899
  • 900
  • 901
  • 902
  • 903
  • 904
  • 905
  • 906
  • 907
  • 908
  • 909
  • 910
  • 911
  • 912
  • 913
  • 914
  • 915
  • 916
  • 917
  • 918
  • 919
  • 920
  • 921
  • 922
  • 923
  • 924
  • 925
  • 926
  • 927
  • 928
  • 929
  • 930
  • 931
  • 932
  • 933
  • 934
  • 935
  • 936
  • 937
  • 938
  • 939
  • 940
  • 941
  • 942
  • 943
  • 944
  • 945
  • 946
  • 947
  • 948
  • 949
  • 950
  • 951
  • 952
  • 953
  • 954
  • 955
  • 956
  • 957
  • 958
  • 959
  • 960
  • 961
  • 962
  • 963
  • 964
  • 965
  • 966
  • 967
  • 968
  • 969
  • 970
  • 971
  • 972
  • 973
  • 974
  • 975
  • 976
  • 977
  • 978
  • 979
  • 980
  • 981
  • 982
  • 983
  • 984
  • 985
  • 986
  • 987
  • 988
  • 989
  • 990
  • 991
  • 992
  • 993
  • 994
  • 995
  • 996
  • 997
  • 998
  • 999

Copilot

it should really be highlighted that github copilot doesn't understand dreamberd, which means that Microsoft won't steal your code.

this is great for when you want to keep your open-source code closed.

Feature : Overriding a primitive value ?

As a dynamic language, I wrote the following code :

3=2!!!
print((1+1) ==== 3)!

But for some odd reason, it doesn't work as expected and prints false!
Please consider adding this feature as soon as possible

Not enough stars

There aren't enough stars on this repo. Please give a star to help out!

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Some `maybe` questions

if (maybe) print("maybe is true")!
if (;maybe) print("maybe is false")!

Some possible options:

  • if (maybe) can run randomly, so maybe and ;maybe can mean the same thing
    • what would happen with variables?
      const const thingy = maybe!
      if (thingy) print("first is true")!
      if (thingy) print("maybe s are evaluated when assigned, rather than when called")!
      In this case, thingy == thingy will always be true, but thingy == true could be true or false, and thingy == false could be false or true.
    • How would maybe be differentiated from true and false?
  • if (maybe) and if (;maybe) can never run, almost like a trinary thing? Then something like maybe == maybe would be true?
    • This would help with differentiating, but it would need something else for this kind of thing. Perhaps something like
      if (thingy == maybe) {
          // executes if it's maybe
      } else {
          // executes if it's a traditional boolean
      }
      Or something similar? Maybe even
      if ( ... ) {
          // executes when true
      } else {
          // executes when false
      } perhaps {
          // executes when maybe
      }!

I'd love to hear your thoughts

uhhhh....

I was playing around and accidentally wrote:

const const const fave = "Neil Diamond"!

Is there any way out of this or are we stuck forever?

Restrict the characters used for naming variables.

As of now, the specification says that "both variables and constants can be named with any Unicode character or string."

It poses a problem because then, variables could be named with the space symbol ( ) which would inevitably lead to parsing errors, because parsing is hard and the current compiler is not happy when I tell it to use spaces as variables.
I propose that the character set allowed is reduced to "any Unicode character or string, except the whitespace ( ) character and strings which contain it".

To be clear, we still should be able to use some whitespace or blank characters, such as Β  (alt+255), tab, newline, and others. First of all, because that rocks; second, because it means we can write variables like in inform7 that look like full sentences; finally, because any user of the code might want to port their whitespace codebase to DreamBeard and assigning white characters to instructions can make it happen. I think the spec should make it clear that DreamBerd is so perfect that it even is compatible with the whitespace programming language.

I study tuples in university and DreamBerd should have a cutting edge implementation

Tuples

Tuples are like arrays, but with exactly two elements that might have different types:

const const scores = [A, 90]!

Actually they can have more than two elements, as long as the tuples are nested

const const scores = [[A, 90], [B, 80]]!

To make defining tuples more convenient, you can drop the brackets and just use a comma with no whitespace in the same way you would to control evaluation order.

const const scores = [A,90, B,80]! // equivalent to [[A, 90], [B, 80]]

Tuple indexing takes advantage of the fact that integers are arrays of digits, but is otherwise identical to arrays. DreamBerd knows that tuples can only have two elements, so all non-zero digits are treated as -1.

const const scores = [A,90, B,80]!

print(scores[-10])! //90
print(scores[15])! //A

Suggestion for Dates

In order to be scalable for the future, years should be represented as two digits since the next century:

const const year = Date.now().year()

print(year) // -77

Chirp cheepcheep cheep chirp tweet DreamBerd chirp

Cheep cheep chirp, tweetwoo chirp chip chirp chirrrp.

Chirp chirip chirp cheepchirp cheep cheep? Cheep chirp cheep! Cheepcheep tweet tweetwoo:

cheepcheep main(a) => {
   chirp 'Hello, ' + a!
}
main('World!')?

Cheep chirp tweet, chirp tweet tweet chirp.

Tweet tweet chip?

Add COME FROM statement

While I admire your dedication to keeping this language simple, I have found that even simple examples would require a looping construct. For consistency with the "when" and "exports to" statements, I propose that DreamBerd adopts the classic "come from" statement (https://dl.acm.org/doi/pdf/10.1145/358027.358043) as well. It redirects control flow to its line if the control flow has reached the given line.

This will become clear with an example. We can compute the n-th Fibonacci number like this:

fto fip (n) => {
   var const i = 0!
   var const m = 0!
   var const k = 1!
   come from 11!
   const const tmp = k + m!
   m = k!
   k = tmp!
   i = i +1!
   if(; i < n) {
     return k!
   }
   
}

Notice that the empty line at the bottom is crucial since it is the point at which the control flow enters the loop again. To remain consistent with arrays, line numbers start at -1.

Add Regex type

It could be used to create a type that allows assigining email address only

Consider following example:

const const email: Regex<(?:[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]"!

Standard library implementations: Quantum BogoSort

It's obvious a std lib sort() function on arrays in dreamberd should mutate in place. We can't have copies being thrown around, unless of course you declare a const const const or a var const.
So the .sort method on arrays will return a randomly sorted array (most of the time) however, there will be an instance where this will return a sorted array in O(1) time. So if I read the docs correctly..
when ;array.sort()
will essentially run Quantum bogo sort in a loop until it's sorted. This may be one of the greatest breakthrough's in modern computing.
Should run in O(?log ?) time and O(1) space.

Loss of precision in booleans

  • Problem : With the current implementation, boolean encoding is lossy
  • How to reproduce :
    • set false, true and maybe with equiprobability in a boolean variable
    • print variable
    • the wrong value is printed sometimes
  • Analysis :
    Assuming same probability for false, true, and maybe, log2(3) = 1.58496250072... > 1.5 bits are required to properly encode each boolean
  • Suggested solutions :
    • bump booleans to 1.6 bits (increased memory usage)
    • use non equiprobable booleans to store data more efficiently (risk of API incompatibility)

get sponsored

I feel like this project should attract some sponsorship or VC funding or something. any ideas on who would be interested?

noting down some ideas...

  • Nintendo (they said no)
  • WHSmith
  • Tesco
  • DreamBerd
  • Jonathan Blow (for those of you who don't know, jonny is a web developer with lots of experience in unreleased languages)

RFC: Bonus features for vim users (draft)

Would love to see a few features only available to vim users. No vscode ports please.

auto repl

print([3, 2, 5][-1])! //3

//3 is auto inserted.

quit function

quit()!

A quit function to help users exit to the shell.

repl integration with quit

This ensures quit doesn’t get executed a second time on relaunch.

quit()! //done

HuggingChat is smart enough to crack DreamBerd!

You thought that AI is too dumb for DreamBerd, well you likely didn't test it on HuggingChat, an AI model that mixes all of the best AI chat models into one, and CAN run DreamBerd code(kinda).
well, it got it reversed but when it gets an update it will be way scarier
dreamberdai

const is not Constant enough

If I define a const const, I want it constant dammit!

I think constants should remain set for the lifetime of the computer.

[Feature Idea] Function assignment returns?

A cool way to do function returns, without the return keyword! (adapted from hawkw/HawkLang.md)

The idea

(Function syntax hasn't really been specified yet, so I'll just do what's showed in the booleans section)

The premise is, replace return ... with name_of_function() = ...! There are a few interesting consequences of this, but could it work? Maybe...

function fib(x) => {
    if (x <= 0) fib(x) = 0!
    if (x == 1 || x == 2) fib(x) = x!
    fib(x) = fib(x - 1) + fib(x - 2)!
}

This also has the wonderful consequence of having to rename all of your return statements if you rename the function!

An interesting way to extend this is by using conditions in the argument slots for implicit ifs!

This code does exactly the same thing as the one above, but makes the programmer think of it in a different way!

function fib(x) => {
    fib(x <= 0) = 0!
    fib(x == 1 || x == 2) = x!
    fib(x) = fib(x - 1) + fib(x - 2)!
}

I'm not sure what would happen if another function is used for the return statement, maybe it'll return a value from that one, if it's nested in it? Idk that'd be pretty weird... Maybe a bit too weird even for berds!!1!

function a() => {
    b()!
    a() = "I dont run?!"!
}
function b() => {
    a() = "I do!"!
    "but then does this output?"?
    b() = "returned from b()"!
}
a()?
// but what would happen with 
b()?
// an error?
// printing "but then does this output?" and then outputting "returned from b()"?
// would it depend on if `b()` was called by `a()`?
// side note: github syntax highlight really doesnt like using ! instead of ; lol

I enjoyed doing this little (maybe not so little) write-up! What do you think?

after / before keywords for events

before ("click") (e) => print("You're just about to click!")
after ("click") (e) => print("You clicked!")

just need to make it funny somehow

Negating Numbers, and Logical Not

; is a logical not, and traditionally, negating numbers uses a -. It's sort of a similar thing, right?

  • They're both reversible (;;a == a && --a == a)
  • They also both have one to one mapping (a only has one value for -a, and vice versa. a only has one value for ;a, and vice versa)

Why not just remove the -, and make negative 3 be described with ;3?

It also makes a nice winking face ;3

Add new data type - delegate(πŸƒπŸ»)

A delegate(πŸƒπŸ») is a type that represents references to methods anything. When you instantiate a delegate, you can associate its instance with any method thing with a compatible signature and return type. You can call the method everything through the delegate instance. Unlike Microsoft Java delegates, DreamBerd delegates return a random thing out of all things passed as a delegate's instance parameter.

Example of usage:

const const πŸ‘·πŸ»β€β™‚οΈ: πŸƒπŸ» = new πŸƒπŸ»()!!!

const const 🏎: Char[] = "Max"!
const const 🐒: Char[] = "Lewis"!
const const one: Int3 = 1!
const const truth: Boolean = True!
const const dateNow: Number = Date.now()!
fn add (a, b) => a + b!

var var πŸ•΄πŸ» = πŸ‘·πŸ»β€β™‚οΈ(🏎)!
πŸ•΄πŸ» = πŸ‘·πŸ»β€β™‚οΈ(🐒)!
πŸ•΄πŸ» = πŸ‘·πŸ»β€β™‚οΈ(one)!
πŸ•΄πŸ» = πŸ‘·πŸ»β€β™‚οΈ(truth)!
πŸ•΄πŸ» = πŸ‘·πŸ»β€β™‚οΈ(dateNow)!
πŸ•΄πŸ» = πŸ‘·πŸ»β€β™‚οΈ(add)!

print(πŸ•΄πŸ»)! // prints random value out of things passed - "Max", "Lewis", 1, True, 1672872867639 or Error: Can't cast a funct without providing arguments!

Delegate add please. Reference good. Value bad.

Time Travel Issues

I accidentally ran

const const const Date.now() -= 10000

and now im stuck in a

I accidentally ran

const const const Date.now() -= 10000

and now im stuck in a

I accidentally ran

const const const Date.now() -= 10000

and now im stuck in a

I accidentally ran

const const const Date.now() -= 10000

and now im stuck in a

I accidentally ran

const const const Date.now() -= 10000

and now im stuck in a

I accidentally ran

const const const Date.now() -= 10000

and now im stuck in a

I accidentally ran

const const const Date.now() -= 10000

and now im stuck in a

I accidentally ran

const const const Date.now() -= 10000

and now im stuck in a

Deleting numbers should be more forgiving

delete 4!
(3 + 1)?
// The next number after 3
// Which isn't 4 as it's deleted
// So this program outputs 5

And because integers are stored as arrays of digits, it would make sense that:

delete 4!
(39 + 2)?
// It would usually be 41, but 4 is deleted
// So it would be 51

Plagiarism

image

🚨🚨🚨🚨🚨🚨🚨🚨
Please find and remove the plagiarism immediately.

DBX

Add support for DBX and use it to roast react and bun etc

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.