This is great. Usually with the joke programming languages, you can get at least one person arguing that "x feature" really isn't all that bad, or could maybe be useful. DreamBerd beats them all in that regard. It is 100% terrible! I lost it at the lifetimes implementation.
You must be a fan of Subversion then. On a more serious note, I'm sure I've seen this (any unique shortenings standing in for the whole word) in an actual language at some point, and it was infuriating.
In the normal case, Alice can write 'const const true = false' and Bob, on a second machine, can write 'const const true = 7', and there will not be an error. But if Alice writes 'const const const true = false', than Bob can't reassign or mutate 'true' without throwing an error. It's for truly global constants
Come to think of it, package registries are sort of “superglobal” in many languages. It’s not entirely far-fetched to imagine a language in which variables themselves can be super-global. Heck, MUMPS global variables are immediately persisted to disk and visible to all other processes - and that’s a real language used in real systems!
But what elevates it is that it's written so confidently and buries the insane lede so well that at each feature there's a fraction of a second where it seems recoverable before sanity kicks in. After, before, and next almost, almost seem smart
> 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")!
}
If it can really be triggered when the variable changes to any value it makes it a truly reactive paradigm programming language. By the way, could that be hacked to implement loops?
const var i = 10
when (i >= 0) {
do_something()
i = i - 1
}
var var i<10> = 0!!
var var i = false!
when (i) {
print(i)!
i++!
}
I think this should print 0,1,2 and then stop, assuming checking the condition is a line of code, and that lifetimes are for lines executed and not just the syntax.
It's basically a syntactic sugar on an Observer pattern but I like it. You would need a way to turn off 'when' observers. And I suppose it does couple the observer to the observable pretty tightly.
I also quite liked that idea. It would probably be a nightmare to actually use, but it's definitely a creative solution to dealing with infix operator precedence.
The only implemented language I know of with this feature is the obscure array lang I (an incrementation of the J language's name I assume) by Marshall Lochbaum:
Infinite lifetime is actually useful here and there. I'll usually slap an infinite lifetime wrapper around the `requests` or `httpx` module when I'm testing out some Python web scraping code.
I think it would lead to a lot of hard to find logical bugs in a lot of projects but I think it would be a great operator in say, a scripting language for a turn based game.
I am currently working on a DSL which actually does include a "back" operator! The language is used to describe simulated circuits, so you can inquire about the value a register had during a previous clock cycle.
Love the constants. Biggest confusion for me reading modern javascript, coming from traditional languages. "What do you mean you can change a constant?"
This is incredibly good. It maintains the breathlessly approving tone of a language readme the entire time, it has incredible comedic timing (a lesser shitpost would have revealed that of course the file extension was .db right at the start), and it has incredible internal consistency. For some reason it was the fact that it demonstrates how "files" work by rebinding a const const that sent me completely over the edge. Or maybe it was the regex describing valid regex labels
Breathlessly approving tone of a language readme: Readmes on Github, especially for languages, often have a recognizable tone. Look how cool this is! Isn't this so neat!? Why would you ever do it differently!?
Comedic timing (in text): Most prose is written under the assumption that it will be read in order- ie, from beginning to end. For instance, you likely read the word "beginning" before you read the word "end" in that last sentence, and read the word "to" between them. So for instance, while "a lesser shitpost would have revealed that of course the file extension was .db right at the start", this superior shitpost has text between the start and the reveal. This is analogous to how, when speaking, a comedian will maintain awareness of pausing and such to drop funny lines at exactly the right moment.
If you are constantly exclaiming, you are likely to become breathless. Exclaimations are signified with an Exclaimation mark. Pauses and other timing can be signified with commas, dashes and ellipses.
I sort of spoiled the joke for myself because the first thing I noticed was that it didn't have a standard license (github says view license instead of Apache or whatever). So I clicked on it before even reading what the language was about, still thinking it was serious.
Please no! Someone may try to actually use this in some corporate production model -- I can see the carnage now - the language, editors where you can write left to right, right to left, or even vertically with an exta cost plug-in, training courses at $1500/day -- the horror of it all! Don't forget the vertical camelcase variable names where letters appear, not only in both cases, but on two lines. You know of course, tehre's a special place for you when the mist clears. You'll either be stuck in the Bank of America customer care department for eternity, or, be stuck in the other Big Red helping to get Larry Elisson's network computer workig -- FOREVER.
Genius! This trivially solves the problem of reading integer and floating point numbers from input and inserting them into a sorted array. Too bad there are no loops in this language.
So it’s not invariably true that arrays start at -1? They only start at -1 after an array literal assignment? You need to update the language description! ;)
A correction on another comment -- this is not a multithreaded language -- it's transthreaded-- a radically new concept where your code may or may not, run code in your thread, or someoen else's thread, without your knowledge. Errors in your code show up in their program, and their errors, in yours - see? Now bugs aren't your fault anymore!
And don't forget the KvetchGPT option. It's doesn't so much as complain about your code as you go along. It's like pair programming with your manager but you can turn them ofF.
I haven't laughed like this in a very long time, very well done.
Looking at the cellular automatons video, I felt it captures the early sense of wonder learning about math and programming.
But also, the despair in what problems are actually kind of open. What if I design a cellular automatons where every neighborhood is in the shape of a Disney character and every value it can take corresponds to the release date of one movie that was in the global top 10 of highest grossing movies?
Well, turns out that's a special case of a Heisendorff-Circlydot automatons, which was solved using topolographical methods in the 80's and the only open question have been proven to be equivalent to proving the consistency of Riemann.
Unless say you give each cell a bounded notebook with a given number of page, in which case the problem falls into a weird computability class between the gaps of the Chomsky hierarchy. And then it's thesis material :-)
> But also, the despair in what problems are actually kind of open.
I loved the video too and initially felt the way you felt. But as I thought more about it, I don’t think that value is found in doing something that nobody ever has done before, that might be nay impossible for the majority of humanity. I think that new for the individual is very valuable, like, how to solve quadratic equations has been solved for a long time, but it’s still new to new people all the time!
But even more powerful is the application of the not-new to a new setting! One might think that because, say, proper data management has been “solved” (as in, there are tools out there like SQL and graph DBs and such), it is solved for everybody, but it only takes one glance at huge international companies that are held together by an assorted array of excel files moving around in a semi-random way with no data types, enormous space for human error, and some other atrocities for data management… it’d be of great value for such a fictional organization that has never existed to do something “new” for them, use and actual database!
It's no surprise that when you make virtually all mainstream programming languages OOP, then there will be a vast amount of bad OOP code out there (as by definition mainstream code then becomes "OOP code").
IIRC, numbers without a percentage sign are assumed to be percentages. Numbers that are not percentages have to be followed by ;% (the semicolon is the NOT operator in DreamBerd).
I've seen this called "bulldozer code". As in "Hey, all of those plain functions need to be OOP! Get a big earth moving machine and gently push them inside the curly braces of a class! Which class? Any class!"
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:
white_check_mark DreamBerdScript (not owned by the DreamBerd Foundation - you are free to use this name)
x ECMAScript (owned by the DreamBerd Foundation - please consider renaming)
x Rust Foundation (owned by the DreamBerd Foundation - please consider renaming)
Maybe the author should actually take over the Rust Foundation.
214 comments
[ 2.5 ms ] story [ 218 ms ] thread> 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!
Here are some of my favorites:
union
funi
funion
fution (sounds like fussion)
fu
fuc
fucton (as noted by a fellow commenter)
I mean constant constants, constant variables, and variable variables seem useful.
I'm not sure how would variable constants be useful.
Also, anybody knows the difference between constant constant and immutable data (constant contact constant)?
> In case you really need to vary a variable, the when keyword lets you check a variable each time it mutates.
If it can really be triggered when the variable changes to any value it makes it a truly reactive paradigm programming language. By the way, could that be hacked to implement loops?Maybe Prolog is the perfect language.
Side-effect is that it will delete all the whens, so only use it if you need it!
About coupling, an implementation could send state change events to a message bus and observers could subscribe only the events they care about.
The only implemented language I know of with this feature is the obscure array lang I (an incrementation of the J language's name I assume) by Marshall Lochbaum:
https://github.com/mlochbaum/ILanguage
Infinite lifetime is actually useful here and there. I'll usually slap an infinite lifetime wrapper around the `requests` or `httpx` module when I'm testing out some Python web scraping code.
But yes you can modify objects and arrays of a constant, which is not great.
What does this mean?
it has incredible comedic timing
How does text have comedic timing?
Comedic timing (in text): Most prose is written under the assumption that it will be read in order- ie, from beginning to end. For instance, you likely read the word "beginning" before you read the word "end" in that last sentence, and read the word "to" between them. So for instance, while "a lesser shitpost would have revealed that of course the file extension was .db right at the start", this superior shitpost has text between the start and the reveal. This is analogous to how, when speaking, a comedian will maintain awareness of pausing and such to drop funny lines at exactly the right moment.
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
HAHAHAHAHA
https://github.com/TodePond/DreamBerd/blob/main/LICENSE.md
(Remember that arrays start from -1.)
If you did the first, then the second one, two 4s would be placed at the start.
Please note: I will close any issues without unreproducible steps.
Surely you meant "without reproducible steps"?
The latter could be phrased like this: "Please note: I will close any issues with reproducible steps."
For more info, please read my blog post "Why unreproductions are required".
I think you should support the following API
But you guessed right at least the features from my ACPUL no-keyword programming language.
Here is a quick comparison DreamBerd vs ACPUL:
! - should use ';' and use everywhere if(..){..}; This is important!
if (;true) - no boolean operators !, &&, || etc. no else. use
Naming - unicode by default and fully translatableFloating indexes in arrays. - works, but it's called a map
When - works but with restrictions Loops - there are loops here but no "break" keyword, just set the end value. Same for functions and there is no "return" keyword, use if(..)Indents - 1 space ident is highest priority. Maybe your editor ident: 2 space or 4 space, -3 is possible, but rare case
Function - don't need to write any keyword like 'fn' or 'func'. just func1 {..};
Strings - all strings always zero quotes. var=STRING;
File Structure - Yes! Really usable and it looks much better than other languages
AI - fully designed for AI copilot and works with partially defective code
..and it works. I wrote a lot of code. Lets fun :)
Here is the demo app https://github.com/web3cryptowallet/Web3CryptoWallet
Looking at the cellular automatons video, I felt it captures the early sense of wonder learning about math and programming. But also, the despair in what problems are actually kind of open. What if I design a cellular automatons where every neighborhood is in the shape of a Disney character and every value it can take corresponds to the release date of one movie that was in the global top 10 of highest grossing movies? Well, turns out that's a special case of a Heisendorff-Circlydot automatons, which was solved using topolographical methods in the 80's and the only open question have been proven to be equivalent to proving the consistency of Riemann.
Unless say you give each cell a bounded notebook with a given number of page, in which case the problem falls into a weird computability class between the gaps of the Chomsky hierarchy. And then it's thesis material :-)
I loved the video too and initially felt the way you felt. But as I thought more about it, I don’t think that value is found in doing something that nobody ever has done before, that might be nay impossible for the majority of humanity. I think that new for the individual is very valuable, like, how to solve quadratic equations has been solved for a long time, but it’s still new to new people all the time!
But even more powerful is the application of the not-new to a new setting! One might think that because, say, proper data management has been “solved” (as in, there are tools out there like SQL and graph DBs and such), it is solved for everybody, but it only takes one glance at huge international companies that are held together by an assorted array of excel files moving around in a semi-random way with no data types, enormous space for human error, and some other atrocities for data management… it’d be of great value for such a fictional organization that has never existed to do something “new” for them, use and actual database!
> You can make classes, but you can only ever make one instance of them. This shouldn't affect how most object-oriented programmers work.
This describes my experience with most OOP code very well.
As for OOP, a bit more realistic would have been to restrict interfaces to at most one implementation.
https://gwern.net/doc/cs/2005-09-30-smith-whyihateframeworks...
Note that one of the comments is from me :-)
It's no surprise that when you make virtually all mainstream programming languages OOP, then there will be a vast amount of bad OOP code out there (as by definition mainstream code then becomes "OOP code").
DreamBerd probably allows this.
If not, maybe you can hoist the ability to hoist % symbols, before which you can hoist % symbols.
I'm more inclined to follow the bell curve. 10% crap, 40% mediocre but rather bad, 40% mediocre but rather good and 10% great.
That sounds interesting. Who has researched/written about that?
The kOS plugin for Kerbal Space Program implements a programming language that actually has this feature.