The Worst Programming Language Ever - Mark Rendle - NDC Oslo 2021

Поделиться
HTML-код
  • Опубликовано: 8 фев 2025

Комментарии • 3,9 тыс.

  • @kennichdendenn
    @kennichdendenn 2 года назад +4105

    Even better: do memory management like taxes - there is a GC that knows exactly about things to delete, but you still need to manually predict what it would do - and the program crashes some time later if you forgot.

    • @MrRyanroberson1
      @MrRyanroberson1 2 года назад +258

      excellent idea and it would have been a wonderful criticism of the tax system at the same time

    • @snake3837
      @snake3837 2 года назад +57

      Valgrind :D

    • @SeleniumGlow
      @SeleniumGlow 2 года назад +123

      This is the most chaotic Idea that I want to see in a programing language.
      This might also help make programmers understand that memory can be a limited resource too 😆

    • @godowskygodowsky1155
      @godowskygodowsky1155 2 года назад +15

      @@SeleniumGlow Free? What is that?

    •  2 года назад +15

      @@MrRyanroberson1 I don't know, tax system where I live works just fine. :)

  • @matthewparker9276
    @matthewparker9276 2 года назад +296

    It's not really a programming language, but when maple gives you an error, rather than give information you can use to correct the error it gives you a hyperlink to the relevant help page on their website, many of which simply read "a help page for this error does not yet exist."

    • @calmeilles
      @calmeilles 2 года назад +31

      It would be even better if it just returned a 404.
      And randomly a 503.

    • @gsus3918
      @gsus3918 2 года назад

      Had me in the first half.

    • @squarerootof2
      @squarerootof2 2 года назад +8

      // TODO (Which in Spanish means ALL)

    • @traveller23e
      @traveller23e 2 года назад +14

      That's the same strategy Microsoft uses for the help sections in Windows Settings. It's annoying (not least because it always opens a Bing search in Edge, not just a hyperlink to the page in your default browser) but not a huge problem all the way up til the time the problem you're trying to solve has to do with internet connectivity. Ask me how I know.

    • @kongchan437
      @kongchan437 2 года назад +1

      @@traveller23e ok. How you know ?

  • @PhilR0gers
    @PhilR0gers Год назад +156

    I once used FORTRAN on a Harris computer. It was possible to declare identifiers with numeric names. So you could have an integer variable called 3, and assign it the value 7. From then on, 3 + 4 would equal 11.
    So easy to sabotage somebody's code by slipping in a declaration like that.

    • @johnsmith1953x
      @johnsmith1953x Год назад +4

      That was with PL/2.

    • @peterbustin2683
      @peterbustin2683 Год назад +2

      I remember the Harris. We had one at Norwich City College - took up several floors!

    • @jackOfAllTrades93
      @jackOfAllTrades93 Год назад +7

      Dear God, that is despicable!

    • @m4inline
      @m4inline Год назад +2

      Harris! Now that is a blast from the past!

    • @adhillA97
      @adhillA97 7 месяцев назад +4

      So what you're saying is we should allow numeric variable names _and_ remove €-prefixing for specifically numeric variables.

  • @SergeyLergDev
    @SergeyLergDev 2 года назад +344

    Another suggestion from Lua: all variables are global by default, you have to remember to put the “local” keyword every single time if you don’t want weird bugs and memory leaks.

    • @anon_y_mousse
      @anon_y_mousse 2 года назад +45

      And require the "global" keyword for all variables at global scope and add "local" to the front of that to designate module scope for a global.

    • @brentsteyn6671
      @brentsteyn6671 2 года назад +14

      Lua... Why!? I feel bad for a lot of kids programming in Lua.

    • @Anriuko
      @Anriuko 2 года назад +21

      @@anon_y_mousse Sounds reasonable. It would be great to have some syntactic sugar to spare the poor programmers from typing though (errors can happen during typing), so I'd like to see some syntactic sugar like "glocal" for "local global" and "lobal" for "global local". The portmanteau type specifiers follow Reverse Polish Notation, which might confuse a new comer, but fuck them.

    • @anon_y_mousse
      @anon_y_mousse 2 года назад +3

      @@Anriuko I love it.

    • @Scriptease1
      @Scriptease1 2 года назад +19

      But make them truly global, like a a centralized server keeping track of the global variable and its current value, we might run into problems in the future when we colonize other planets though

  • @FoxDr
    @FoxDr 2 года назад +541

    Hello, I 'd like to say I've fallen in love with BS, and am working on an interpreter for it. Unfortunately, I couldn't get static analysis to work reliably for DELETE, so I added a garbage collector.
    Now don't get confused, it's not a collector of garbage, but a collector that IS garbage. It works by clearing all memory every 13 lines unless specifically asked not to do so by writing the line "NOT YET", the space is part of the keyword.
    Now I do want programs written with my tools to be compatible with yours, so you still need to DELETE all variables, however my interpreter will only be able to warn you about 5% of missing DELETEs, by crashing at runtime.

    • @Daniel_Zhu_a6f
      @Daniel_Zhu_a6f 2 года назад +5

      you should totally add custom infix operators like in haskell. and allow programmer to shadow any system keyword and operator

    • @szirsp
      @szirsp 2 года назад +10

      Brilliant!
      Where is the language standard's or compiler's repository/wiki? I would like to fill in some feature requests :)
      ... like partial pseudo randomization of operator precedence... at run time

    • @main-netenterprises9912
      @main-netenterprises9912 2 года назад +3

      @notfiveo and who are his audience?

    • @kernelpickle
      @kernelpickle 2 года назад +15

      To be fair, if you can't implement BS in it's purest form, then you should consider the project a fork of BS and call it BS- instead.

    • @shaheerziya
      @shaheerziya 2 года назад +1

      That is SO EVIL

  • @gregory-of-tours
    @gregory-of-tours 2 года назад +200

    The idea of allowing anyone to upload an image that can then be downloaded as a "UTF-256" character sounds like something a startup might actually do.

    • @gellertli2916
      @gellertli2916 2 года назад +4

      @@BenjaminBrienen That's the point of the joke, dummy

    • @willsterjohnson
      @willsterjohnson 2 года назад +14

      @@gellertli2916 you'd still need some service which holds a masterlist of source content indexable by hash, otherwise you'd need to run a bank of GPUs to hell and back to figure out what to display- oh my god that should be a design feature.

    • @vanesslifeygo
      @vanesslifeygo Год назад +8

      still better than NFT logic!

    • @temp50
      @temp50 Год назад +1

      @@vanesslifeygo Hm, not better but different. You can store the unique characters in the blockchain so noone else could modify them later on.
      And since the ladder is decentralized there would be no single owner of the whole "database" either.

    • @Galahad54
      @Galahad54 Год назад +4

      I like the idea of identifying each LLC with its UTF-256 character. So, to transfer a sum of money or an NFT from one LLC to another, one UTF-256 to identify FROM, TO, SUBJECT, CURRENCY or object type, and quantity. And no error checking, If a bit error means I now own the GDP of China or Elon, oh well. And all timestamps indicate the transaction occurred in the distant past, so any possible statute of limitations has expired. Wait. Should I patent this?

  • @FireSiku
    @FireSiku 2 года назад +274

    They should definitely take a pillar of programming from the world's fastest embedded language, Lua: Variables are part of the GLOBAL scope unless specified with the "local" keyword. So if you typo a keyword, it won't error, it will instead create a global variable by that name. This will "reduce" compiler errors and maximize fault on the programmer themselves!

    • @phizc
      @phizc 2 года назад +32

      E.g.
      function Check(€val isMaybeA Number)
      42 CRASH_AND_BURN
      unless €value !!=! 5
      Delete €vall
      Creates global variable €value
      Doesn't throw exception even if €val is 5
      Creates, then deletes global variable €vall
      If so, I like it 😁

    • @mikewoodman2872
      @mikewoodman2872 2 года назад +7

      Sounds reasonable.

    • @CrateSauce
      @CrateSauce Год назад +7

      And the best way to check that is to compile it with -s, then decompile it, and search for variables that aren't Lx_x

    • @andrew_ray
      @andrew_ray Год назад +2

      @@phizc And then crashes because you didn't Delete €val and €value.

    • @VisionThing
      @VisionThing Год назад +4

      What brain dead designer thought it would be better to introduce a runtime bug than to catch the error at compile time? In what fantasy world would introducing a random global variable be preferred, just so the darn thing would compile (but not work)?

  • @thespikything
    @thespikything 2 года назад +287

    I've got one. ActionScript 1.0 (around 2003-2004) was case INSENSITIVE... yup. Then, about a year later, the next version of Flash came out and the compiler was case SENSITIVE (as it always should've been, obviously). And no, I'm not talking ActionScript 2 or 3, which are different languages (even though AS2 shares the same VM as AS1). I mean the same code could now fail magically and the number of agencies that had no clue what they were doing was shocking. But, without proper compile time errors, code would just fail to run without really telling you why, because someone had defined a function *myFunction*, then tried to call *myfunction*. And no, runtime exceptions came later. Sooo, I feel a little bit bad at how much money I earned during that time fixing Flash games and sites for agencies simply by changing one letter... but not *that* bad ;)

    • @RupertReynolds1962
      @RupertReynolds1962 2 года назад +14

      I've never understood the obsession with case sensitive syntax. My stuff either ignores newFile vs NewFile, or spits out a warning.
      In the current context, we should have undocumented rules about when differences in case are silently ignored, reference two different things, or just cause a sudden stop with a messge that says "No! WRONG!" without naming which block of code failed :-)

    • @kennichdendenn
      @kennichdendenn 2 года назад +14

      Ohhhhhhh. Still happens all the time with JS file names in imports which works on windows and fails on linux in prod...

    • @Akronymus_
      @Akronymus_ 2 года назад +8

      "fun" fact: progress openedge is case insensitive, allows you to abbreviate most things and if you use a column/table name it automatically writes to the database.

    • @JulieanGalak
      @JulieanGalak 2 года назад +3

      I don't recall which version of AS I had the misfortune to cross paths with, but it was, without a question, the worst language I've ever used.

    • @trafficconememes331
      @trafficconememes331 2 года назад +2

      they couldve at least called it actionscript 1.5

  • @TheNameOfJesus
    @TheNameOfJesus 2 года назад +150

    In many cultures the digits '4' and '13' are considered unlucky, so to avoid offence, the compiler will generate an error whenever it comes across these characters. Programmers will be expected to code expressions to avoid these values. Eg, "5-1" and "15-2" would not cause an error. Note that representing 13 by 14-1 would also cause an error since it contains the digit '4'. And there would be no builtin constant for Pi, so programmers would have to come up with their own ways of writing 3.1415 without using the digit 4. Variables that contain the character '4' or '13' would also generate errors. And to make the language kid-safe, it would also generate an error for '69'.

    • @that_rendle
      @that_rendle Год назад +11

      I love this.

    • @jan-lukas
      @jan-lukas Год назад +15

      Ban '420' as well

    • @TheNameOfJesus
      @TheNameOfJesus Год назад +10

      @@jan-lukas Yes, sorry I missed that. Perhaps the full list of offensive numbers needs to be configurable. I recall now that someone told me that in Vietnam the number 1 is generally considered offensive, such as in "He's our first born child, our number one child." So perhaps Pi could be written as 3.36359-0.222 (without a 1 or 4 or 13.)

    • @Serendip98
      @Serendip98 Год назад

      Ha ha, such nonsense I didn't come across yet, but who knows ?

    • @Yupppi
      @Yupppi Год назад +2

      I think you got a good idea there, but I'm also thinking PI should actually be in the language. But preferrably as 6.2830... like was suggested back in time when they were thinking about pi. Or just make it 3.0 like some people suggested to make it easier. Because that's a smart thing to do.

  • @TigerWalts
    @TigerWalts 2 года назад +515

    I noticed that the string interPOLation used the dollar ($) symbol and not the Euro (€). I think using the symbol for the Polish Złoty (zł) would be more appropriate.

    • @artemis_fowl44hd92
      @artemis_fowl44hd92 2 года назад +62

      @jernejj5 I think it should be dependent on your region, but always giving you the most annoying one, like for EU use ¥, for US use zł and so on. Obviously has to fail if you run it in another region.

    • @frenk051
      @frenk051 2 года назад +40

      @@artemis_fowl44hd92 Code region locking, DVD style. Of course, for customer convenience, trans-regional transcribing should be offered as a service. €100 per variable mention, including the ones in comments and "Delete" statements.

    • @renatzkigab2616
      @renatzkigab2616 2 года назад +1

      Wtf! Lol

    • @tomlxyz
      @tomlxyz 2 года назад +2

      The Euro didn't exist back then

    • @artemis_fowl44hd92
      @artemis_fowl44hd92 2 года назад +9

      @@tomlxyz If the first talk was in 2014 (As said in the video), the euro did exist 15 years.

  • @Gunstick
    @Gunstick 2 года назад +795

    ideas from MS-office: some instructions should be localized. i.e. goto, gehezu, allerà ... depending on the OS's language. This should also fail for executables, if you run an english EXE in france, it should fail with "goto command unknown, did you mean allerà?". Also depending on locale, the meaning of "," and "." should be swapped, not only in numbers, but also everywhere else in the language.

    • @endymallorn
      @endymallorn 2 года назад +145

      That error is too helpful. At best it should be “Unknown Command”.

    • @mek101whatif7
      @mek101whatif7 2 года назад +14

      @@endymallorn Nah, just extract a random keyword

    • @simonmultiverse6349
      @simonmultiverse6349 2 года назад +47

      How about "AN ERROR HAS OCCURRED" ? The error could be one of:
      (a) there is a bug in the program; or:
      (b) the run-time code has erroneously decided that there is an error.
      HOWEVER, and independently of the above, there is also the possibility that:
      (c) a genuine error has occurred, but the system has failed to report the error. Naturally, you have to use your psychic powers to discover that this error exists, where it is and what it is.

    • @sac7404
      @sac7404 2 года назад +24

      No error message whatsoever, just restart the PC if something goes wrong. Of course there is no errors log too

    • @satakrionkryptomortis
      @satakrionkryptomortis 2 года назад

      you sick fck.....i like it.

  • @rjeninga
    @rjeninga Год назад +364

    Something I admire about ancient COBOL is the ALTER statement (ALTER labelname1 PROCEED TO labelname2). This has the effect that if you have a "GOTO labelname1" somewhere in your code, it will jump to labelname2 instead (after the ALTER statement has been executed; before that it'll jump to labelname1). Maintaining code with more than one ALTER statement is a horror, which makes it a perfect candidate for BS.

    • @InXLsisDeo
      @InXLsisDeo Год назад +29

      Computed GOTOs from Fortran, like GOTO X*2+1

    • @that_rendle
      @that_rendle Год назад +38

      @@InXLsisDeo @rjeninga Why not both? Computed ALTER statements, like ALTER X*6+1 PROCEED TO X*7-2

    • @robstein67
      @robstein67 Год назад +4

      I like the alter but another COBOL example is PERFORM x THU y..... Some unsuspecting soul puts some code in between those parras... get's well... a present. You can add the optional "x TIMES" on the end for a good and proper job.

    • @RayyMusik
      @RayyMusik Год назад +10

      I wrote hundreds of COBOL programs for several companies; GOTO (except error-exit) was strictly forbidden throughout. You can do structured programming in COBOL!

    • @JohnSmith-ox3gy
      @JohnSmith-ox3gy Год назад +3

      @@that_rendle Thanks, I hate it already.

  • @flamingmojo9575
    @flamingmojo9575 2 года назад +571

    I'm scared to think of what horrors the (clearly battlescarred) audience would have come up with, given more time. Every suggestion gave the reaction of "That's so evil, I love it".
    The best I could come up with is requiring any valid source code to be hashed and minted as an NFT by BSCorp in order to compile successfully / without a You-wouldn't-download-a-car--esque warning

    • @sebastiannicolaikaupe5175
      @sebastiannicolaikaupe5175 2 года назад +58

      I spent the whole part about useless variable prefixes waiting for him to announce that the prefix actually does something, like in Ruby. Maybe something like "€ prefix means it is heap allocated, ß as prefix makes it a stack variable." Of course, assigning a stack-allocated var to a heap-allocated one (or vise versa) doesn't work, you'd need some kind of special syntax to convert between them. Would make refactoring fun.
      Edit: Oh, I've got it! Converting between head and stack allocated variables can be done by calling a function (or a parens-less keyword) called convert with the variable to be converted as an argument. Of course, error handling is important, so calling this function/using this keyword would inject your current namespace with a head-allocated variable called "okay" (or something like that) which YOU are responsible for. So, everytime you call convert and forget to Delete okay;, you are leaking memory. And of course, okay contains a string, not a bool or something sensible like that!

    • @dalmationblack
      @dalmationblack 2 года назад +37

      I suggest that we use both of Japanese's quotation mark sets instead of parentheses, so that nested parentheses need to be given different characters like they do in that language.\
      Lets us add 4 additional characters to our expensive keyboard while we're at it. I like it cause it would almost be useful if it weren't so annoying, and because it fucks up character spacing.
      i.e.:
      「unless 『€i !!=! -1』」;
      Edit: more than two-layered nested parentheses should alternate:
      「unless 『「€i * 2」 !!=! -1』」;

    • @BradenBest
      @BradenBest 2 года назад +20

      thing is with a language like this you have to be careful not to dip too far into esolang territory, instead taking inspiration from bad design in non-esolangs. What you suggested is something I'd expect more from malbolge than the language described in the video.

    • @tokeivo
      @tokeivo 2 года назад +12

      I'm just thinking: use the scoping rules of python and javascript combined.
      "this" will just go out of scope at random. Reading from the previous scope is permitted, and will bring the variable into the scope, but writing to a variable from the previous scope is not permitted, unless you ask permission first. Variables with the same name will hide access to the previous one.
      Oh, and loops will not introduce a new scope, but functions will. So for BS, let's say that goto-statements create a new scope, but line numbers do not by themselves.

    • @flamingmojo9575
      @flamingmojo9575 2 года назад +10

      @@tokeivo I like those ideas except 'this' going out of scope randomly, as it doesn't feel very fair or programmy for it to be random. Instead perhaps something similar to INTERCAL's 'PLEASE' where the rules for when it does and doesn't go out of scope are rigid, just not documented anywhere (like every 21st 'this' in the source code is in the global scope)

  • @d4m4s74
    @d4m4s74 2 года назад +670

    The "feature" I hate most in Excel (as far as the code in excel is programming) is that function names localize to the computer language. So if your computer happens to be set to dutch, or german, or norwegian, or whatever you can't following English language tutorials.
    Microsoft even created a function translator you can download in the latest versions of Excel to fix that.
    If you choose to make BS interpreted, localize the functions to the language of the computer running it, so you need to offer a version of your script for every language computer.

    • @ssw4m
      @ssw4m 2 года назад +25

      Excel references are "come from" in two or three dimensions.

    • @Posiman
      @Posiman 2 года назад +67

      Not just the function names, but also localise the variables. You have to use dot as a decimal separator on English computer but comma if your computer is set to Czech or German. Even better if declaration of strings had to follow local quotation marks rules...

    • @schmatzler
      @schmatzler 2 года назад +31

      Oh god, I hate this "feature" with passion. I have set Excel on my machine to English to make it easier to work with.

    • @arnes12345
      @arnes12345 2 года назад +5

      omg yes! This was the worst! Why, Microsoft?!

    • @eirikbrendholen4059
      @eirikbrendholen4059 2 года назад +33

      @@arnes12345 VBA was localized in Excel until 5.0 -- which made it hell/unusable. Imagine "sub test()" would be "subrutine test()". "Option Explicit" would be "Alternativ Mådeklarerevariable" WTF!! Still I'm struggling to help my coworkers that have Norwegian Excel as formulas are Norwegian! So formula =VLOOKUP(lookupvalue; range; index) must be =SLÅOPP.RAD(lookup etc etc) I want to slap the programmers with a soft pool-noodle :D Could they just not make it multilingual???

  • @HelmutNevermore
    @HelmutNevermore 2 года назад +165

    My first programming language I learned as a kid was Pascal. For a long time I couldn't use "else" because the compiler would always return an error whenever I used it and I couldn't figure out what was wrong. At first I was thinking, maybe I have a weird old version of the compiler that doesn't know the word "else", but then I found someone else's programs that I somehow got on the same floppy with Turbo Pascal, peeked into them, and they were using else and it was all right. But I kept getting the same error, so instead of using else I had to close the if section and open another one with the negated clause.
    Only after a good while I realised that THOU SHALL NOT PUT A SEMICOLON AFTER THE COMMAND THAT PRECEDES ELSE.

    • @martinjoster3282
      @martinjoster3282 Год назад +10

      we're learning pascal right now in my college course lmao

    • @PaulPukite
      @PaulPukite Год назад

      ​@@martinjoster3282 Pascal is a good procedural language for teaching.

    • @worldseriesofghosts3408
      @worldseriesofghosts3408 Год назад +1

      ​@@martinjoster3282God WHY?
      On the bright side you could make your own Inno Setup installers with PASCAL script! when life gives you outdated lemons...

    • @martinjoster3282
      @martinjoster3282 Год назад +4

      @@worldseriesofghosts3408 Probably a leftover from earlier days, but the idea of the course is to teach general programming logic and structure to be applied to other languages, and honestly Pascal doesn't seem like a terrible choice for it; it's got the base structures, and something like Python has a lot of conveniences and simplifications which one won't always find in their programming journey

    • @TheStefanskoglund1
      @TheStefanskoglund1 Год назад +7

      you wouldn't see that problem if you by default used 'BEGIN ... END'

  • @nekomakhea9440
    @nekomakhea9440 2 года назад +394

    "COBOL was made so business people can write their own applications the way they want. But they can't even describe the business programs they want, much less write them"
    *Java slowly edging towards the door*

    • @Akronymus_
      @Akronymus_ 2 года назад +18

      progress openedge enters the fray

    • @nekomakhea9440
      @nekomakhea9440 2 года назад +15

      @@Akronymus_ I googled this, and immediately regretted it. thanks.

    • @allanrichardson9081
      @allanrichardson9081 2 года назад +27

      COBOL was written so that it could be compiled on very small machines for the time, and of course also on the larger ones. Thus, a source program was divided into four DIVISIONS to establish, before seeing the procedure code, the more global metadata about the program. The IDENTIFICATION DIVISION gave the name of the program, who owned it, when it was written, how to handle security, and any other administrative information, including a tutorial on how it works.
      The ENVIRONMENT DIVISION told what special options the computer must have, and how to allocate input files to actual hardware.
      The DATA DIVISION described the layout of each file and its data records, and the name and layout of each working memory data variable (and in later versions, the names and layouts of parameter records passed from the calling program).
      And the PROCEDURE DIVISION contained the actual processing logic statements.
      The compiler could therefore be built in overlay phases for small machines: the first phase only had to be able to parse the IDENTIFICATION statements; the second phase, only the ENVIRONMENTAL statements; etc.
      COBOL restricts program variables from duplicating the spelling of reserved words so that, in putting out the temporary source code, each token could be converted, in smaller machines, into a compressed form, such as an index into the symbol table being accumulated; reserved words would be an index into the reserved word table, etc. to make compiling on really small machines possible.
      And also, it was intended to allow managers to be able to read source code and learn how each program fits into the customer’s library, with minimal or no explanation from any programmer (thus, it could be written to be “self documented”).
      FORTRAN originally had no syntax for saving the result of a comparison (the IF statement tested a single number (or expression), and designated a specific statement number to go to if it was negative, zero, or positive).
      FORTRAN IV introduced Boolean values, of which the value of a bit was represented in the program as “.TRUE.” or “.FALSE.” The comparison operators were “.LT,” “.LE.,” etc. and the combining Boolean operators were “.AND.,” “.OR.,” and “.NOT.” This was because the character set was very small.
      FORTRAN also used statement numbers instead of labels, but not every statement needed a number, and they did not need to be consecutive.

    • @cadaankaa
      @cadaankaa 2 года назад +21

      COBOL was horrible. It was built on the premise that somehow "ADD 1 TO COUNT GIVING COUNT" was easier to understand than COUNT = COUNT + 1

    • @allanrichardson9081
      @allanrichardson9081 2 года назад +8

      @@cadaankaa For some folks it is. But it also allows ADD 1 TO COUNT, which is shorter and easier to understand than COUNT = COUNT + 1. And it also includes long names, so you can, for example, write MULTIPLY TIMECARD-HOURS-WORKED BY EMPLOYEE-HOURLY-RATE GIVING OUTPUT-GROSS-PAY. This was good for reading and understanding programs written by other people.

  • @ZestyCrunchy
    @ZestyCrunchy 2 года назад +373

    From BASIC, the language should require line numbers to be part of the source code. It has the advantage that you can move lines around without changing the execution flow of the program. That way, lines can be sorted in a way that are the most aesthetically pleasing.

    • @jorymil
      @jorymil 2 года назад +12

      I get the sense that line numbers are a holdover from when terminals could only display a single line. So... you should only be able to use ed to modify BS programs.

    • @mikewoodman2872
      @mikewoodman2872 2 года назад +3

      Sounds reasonable.

    • @b213videoz
      @b213videoz Год назад

      This is where BASIC is similar to machine code

    • @GregMoress
      @GregMoress Год назад +4

      @@b213videoz First, modern BASIC doesn't require line numbers.
      And second, the line number is not comparable to the it's instructions address, so it's not comparable to machine code. I mean, unless you were considering line numbers to be labels... which is what they were in the dark ages of BASIC.

    • @kamil118
      @kamil118 Год назад +15

      Aesthetically pleasing? No, they shoould be sorted alphabetically, otherwise it's compile error.

  • @kemi242
    @kemi242 2 года назад +278

    PowerShell has a "Verb-Noun" naming convention for function names, where the noun should be strictly singular, and the verb should be selected from a list of approved verbs. If your code doesn't comply with this, you'll get a warning from the linter (at my previous workplace it was enforced in the validation process). BS should adopt this with a twist: The compiler should fail, whenever it finds an uncomplying function name, and the list of approved verbs should be undocumented, and left for the programmer to figure out.

    • @mr.rabbit5642
      @mr.rabbit5642 Год назад +52

      8 years in and we're still finding easter-egg verbs accepted by the devs XD

    • @avishjha4030
      @avishjha4030 Год назад +5

      @@mr.rabbit5642 Can you share some, I'm curious?

    • @VolJoe
      @VolJoe Год назад +14

      I completely agree with you, except for one thing.
      It’s spelled: PowersHell

    • @1992jamo
      @1992jamo Год назад +3

      To be fair, I genuinely love the Verb-Noun format for PowerShell functions. It's not strictly required, is more commonly "Verb - compound noun/specific descriptor", and you can find the approved verbs with the command "Get-Verb".
      After using it for years, I always use the same format without the hyphen in all languages as it makes the method self-descriptive.

    • @avishjha4030
      @avishjha4030 Год назад +1

      @@1992jamo Yeah, do the same in Java, just it tends to elongate names sometimes.

  • @Zameddelung1510
    @Zameddelung1510 2 года назад +751

    I am not sure why, but this talk made me laugh harder than any comedy show ever has... Thank you and I kinda wanna write a BS compiler now xD

    • @mrJety89
      @mrJety89 2 года назад +23

      Please Do

    • @zemoxian
      @zemoxian 2 года назад +30

      There are worse or better uses of your time. So I guess you have to be certain that’s precisely how you want to waste your time.

    • @Kiwifruit00
      @Kiwifruit00 2 года назад +8

      Compile your BS yourself

    • @TheStuartstardust
      @TheStuartstardust 2 года назад +6

      I saw his first talk like this, I think it is 7 years or so ago. Also just as funny - this is just the updated one 😃
      Edit: i was close - ruclips.net/video/hCvHTrUh4os/видео.html

    • @ecoral3603
      @ecoral3603 2 года назад +4

      If some of you want to participate or look it up, I'm working on one at BS-parser in github

  • @AlfW
    @AlfW 2 года назад +160

    5:40 COMEFROM is actually not semantically identical to GOTO if you allow to use multiple COMEFROMs for the same source. This way you could've introduce non-determinism or parallelism in some way, however you define the semantics.

    • @leogama3422
      @leogama3422 2 года назад +12

      This is brilliant

    • @kumoyuki
      @kumoyuki 2 года назад +17

      yes. I kept finding myself wondering how old the speaker actually was, especially during the INTERCAL part. COMEFROM was one of the more subtle jokes in INTERCAL, and I think you needed to be involved in the language debates of the day to truly appreciate the commentary contained in it

    • @SolomonUcko
      @SolomonUcko 2 года назад +10

      Perfect! That's how threading should work! Maybe it'll be nice and also continue to the sequentially next line too.

    • @charliedobbie8916
      @charliedobbie8916 2 года назад +9

      Ooh - new multithreading model maybe?

    • @matthewparker9276
      @matthewparker9276 2 года назад +16

      COMEFROM should start a new thread every time it is used to reduce overhead.
      Though since there is no GOTO, every time you use COMEFROM and don't want a new thread you will need to end the program immediately after the line you are comming from and let it continue in the new thread.

  • @boblangill6209
    @boblangill6209 2 года назад +36

    The use of UNLESS is genius. Rudolf Flesch who wrote "The Art of Plain Talk" remarked that sentences which contain "unless" are among the most difficult to understand.

    • @akirakosaintjust
      @akirakosaintjust Год назад +1

      I wonder about this. I've always found "unless" and "until" pretty readable in Ruby.

    • @Experternas
      @Experternas Год назад

      u sure it wasnt USELESS?

    • @bluegreenmagenta
      @bluegreenmagenta Год назад +4

      To be fair to Ruby, "unless" (and being able to put it at the end of a line) isn't actually original to Ruby -- it originates in Perl, which Ruby actually takes a lot of inspiration from

  • @debaliol
    @debaliol 2 года назад +131

    You forgot one of the best ones. VB6 (and VBA) use Bankers rounding. So 5 is rounded up or down depending if the next most significant digit is odd or even. But that would be far to easy ... BS should round up or down depending on if the line count is odd or even.

    • @gorillaau
      @gorillaau 2 года назад +12

      Sounds too simple, the Douglas Adams principle should apply here as well. If the round function has been used for the 42nd time, then we round the number the other way than expected as we see for the other 41 timeas.

    • @fart_m0nster_420
      @fart_m0nster_420 2 года назад

      Brilliant....

    • @PittDaddy
      @PittDaddy 2 года назад +1

      Yes. That would compensate for too many roundings in the wrong direction!

    • @johanloubser8138
      @johanloubser8138 2 года назад +3

      @@gorillaau No it should always round to the nearest multiple of 42 and then invert on the 42nd call

    • @dickot
      @dickot 2 года назад

      x 69, / 42

  • @alexandersanchez9138
    @alexandersanchez9138 2 года назад +269

    33:56 In Norwegian, there are three gendered indefinite noun articles (in addition to plurals), and so the compiler can also throw a cryptic grammar-checking error if the noun doesn't agree with its gender.

    • @bernhardschmidt9844
      @bernhardschmidt9844 2 года назад +51

      Of course you then need to know the gender for any custom type, so programmers will have to specify the gender of their classes unless the class name ends with a word from a dictionary built into the compiler, in which case specifying a gender is obviously invalid.

    • @jdos2
      @jdos2 2 года назад +19

      If you're going to do that, then why not force conjugation of the various commands so they agree with their subject (singular, multiple object operations), tense (imperative, timeframe), and mood (likely branch, unlikely).

    • @endymallorn
      @endymallorn 2 года назад +1

      And at the start of any program, you must put in a declare block, outlining the declared pronouns for every class & function in every scope. Any he/him function is sent to die, every she/her is considered hysterical and ignored, and any they/them is considered plural, requiring the use of areProbablyA. And if you don’t include at least one gender with an x in it, the program throws a bigot error and refuses to compile.

    • @kargaroc386
      @kargaroc386 2 года назад +13

      Make the whole language strongly inflected, like Latin.

    • @EdouardTavinor
      @EdouardTavinor 2 года назад +5

      Well, that depends on if you speak bokmål or nynorsk. Norway has two official languages.

  • @ethanbeachy6593
    @ethanbeachy6593 Год назад +36

    I'm a mechanical engineer who knows just enough about programming to know that this is hilarious and would be infuriating to use. It reminds me of a time in school a couple years back when I was talking in some of my classmates about "Anti-CAD," similar concept for 3d design. Points had to be circles with zero radius, threads had to be made with a virtual tap or die tool (which had to be turned the right number of threads with the mouse)... I forget a lot of the really funny/annoying features but it was a good comedic break from serious study.

    • @robincray116
      @robincray116 Год назад

      All 3D cad objects must use completely parametised 2D sketches before it can extrude. Then make parameterisation break with anything outside the smallest adjustments.
      Or Autocad light where parameterisations are behind a paywall.
      Or do what SpaceClaim does and make all basically all 2D and 3D operations pushing and pulling the sketch with the mouse.

  • @mattcroft
    @mattcroft 2 года назад +83

    was so struck by this gem the last time I watched him give this talk that I called it Rendle's Law:
    "There's nothing you can suggest that is so unutterably stupid that people won't waste their time attempting it"

    • @unflexian
      @unflexian 2 года назад

      i like this
      hell i even love this, rendle's law is in my vocab

  • @riccardoorlando2262
    @riccardoorlando2262 2 года назад +190

    Allow me to suggest a better way of implementing multithreading:
    The GOTO statement accepts multiple line numbers. When you give multiple numbers, the process forks with each child process starting from one of the line numbers given
    For example, GOTO 42 84 spawns two processes - one starting from line 42 and the other from line 84

    • @alexisrodriguez7127
      @alexisrodriguez7127 2 года назад +14

      I like that idea

    • @window.location
      @window.location 2 года назад

      Looks like elixir on meth

    • @khhnator
      @khhnator 2 года назад +35

      lets do a step beyond!
      instead of goto, lets have a COMEFROM multi threading just like intercal
      you can put a COMEFROM anywhere in your program, and when it reaches that line. it starts execution from the COMEFROM in a new thread... without any warning in the code that is actually running at the time

    • @JordanManfrey
      @JordanManfrey 2 года назад +43

      it should be GOATO (the A is for "asynchronously") pronounced the same as GOTO so it's impossible to disambiguate the two when speaking

    • @CTimmerman
      @CTimmerman 2 года назад +11

      @@JordanManfrey And all functions should be async by default for performance like in Express, so you need to wrap and await everything to make it synchronous.

  • @norbertnemes8877
    @norbertnemes8877 2 года назад +48

    Guys! There is an obvious oversight! Just like in JavaScript, “this” should not always be “this class”. It should sometimes be some random object in memory, depending on what time the code was run at! Amazing debugging sessions!

    • @mikewoodman2872
      @mikewoodman2872 2 года назад +2

      Sounds reasonable.

    • @willsterjohnson
      @willsterjohnson 2 года назад +1

      I like the idea that "this" in a class will act upon the class itself instead of on the instance, unless in the __construct method you call some function built into classes implicitly that isn't documented anywhere. Something like `this.createInstance()`.
      If the __construct is called via `super()` then it will skip over `this.createInstance()` meaning EVERY constructor must call it and it must be called before any super calls, which will directly conflict with "no this access before super", meaning inheritance is implemented but utterly impossible at compile time.

  • @richardfarrer5616
    @richardfarrer5616 2 года назад +65

    I suggest that your DDE (disintegrated development environment) should treat tabs as four spaces but display them as three.
    While I understand the idea behind an odd number of spaces being a comment, I also like the REM function, which made BASIC have to evaluate comments while running. It does so much to improve (lack of) efficiency.

  • @volodyanarchist
    @volodyanarchist 2 года назад +146

    What you can also do for comparison is that when comparing with undefined, the result is not true nor false, but undefined. When checking for equality with null, the result is not true nor false, but null. And if you check that undefined is equals to null, the behaviour is undefined and produces random result each time.
    Inspired by SQL.

    • @techgeeknzl
      @techgeeknzl 2 года назад +26

      For absolutely no fathomable reason, `undefined !!=! undefined ` should evaluate to _true;_ and `null !!=! null` should evaluate to `undefined`.

    • @SreenikethanI
      @SreenikethanI 2 года назад +10

      @@techgeeknzl what did you just type

    • @techgeeknzl
      @techgeeknzl 2 года назад +10

      @@SreenikethanI Yes.

    • @mikewoodman2872
      @mikewoodman2872 2 года назад +3

      Sounds reasonable.

    • @fdk7014
      @fdk7014 2 года назад +4

      In SQL null is not a value. It's the lack of a value. Therefore comparisons with null doesn't make any sense, including comparing null with null

  • @donwp
    @donwp Год назад +23

    Awesome. I think the Delete should have a safety feature borrowed from operating systems. Delete doesn't delete anything, it puts it in the Trash (or recycyle bin if you're on Windows). So, Delete all you want, that space in memory is still in use. You need a second step to reclaim it.

    • @that_rendle
      @that_rendle Год назад +7

      I might actually put that in.

    • @that_rendle
      @that_rendle Год назад +6

      You could actually use this to return values from functions, the caller uses UNDELETE to retrieve the last value(s) that the function Deleted. That would mean the caller had to know the order of Deletion, making the code extra brittle.

    • @jambuMRT
      @jambuMRT Год назад

      @@that_rendle RUNDELETE to do a Reverse UNDELETE in case you wanted the first item ever Deleted (but since the trash has no scope, it could be anything that was deleted)

    • @arctic_haze
      @arctic_haze Год назад

      No. It should work the way ANSI C manages memory. You delete everything, including the whole partition, without any warning.

  • @ToadalChaos
    @ToadalChaos 2 года назад +390

    MATLAB is a treasure trove for this.
    - forgetting a semicolon at the end of the line will echo anything
    - Round brackets are used both for function callings as well as array indexing
    - You can use [] or {} for array indexing as well, however, their behaviour and rules depend on the type of array you are accessing, and they are NOT interchangeable.
    - 'a' is a character array, but "a" is a string. Completely different things.
    - The + operator on character arrays will treat them as vectors, performing element-wise addition of the ASCII values of the characters and returning a new character array. If the char arrays have different lengths, it will crash.
    - On the other hand, the + operator on strings will concatenate them. What happens when you + a string with a char array? I can't remember, and that's an issue.
    - Built-in functions have inconsistent behaviour with regards to strings vs char arrays. Most (but not all) will will accept either as arguments. Some (but not all) will return the same type you gave as input. Many (but not all) will convert strings to char arrays and return char arrays. How can you tell how a built-in will behave? Not from the documentation, because that would be too easy. Fire up your matlab instance, re-activate your license for the 15th time, wait for the IDE to spool up, and try it out!
    - And so, so much more...

    • @bogulans2897
      @bogulans2897 2 года назад +73

      And the most crucial - array starts at index 1

    • @Croesquared
      @Croesquared 2 года назад +56

      Another “great” Matlab feature: logical variables aren’t “true” or “false” but 1 and 0, which are not to be confused with numerical 1 and 0.

    • @robin9740
      @robin9740 2 года назад +9

      But it is the easiest language to learn imo. Having it as your first programming experience makes it hard to learn other languages tho...

    • @camhadland6227
      @camhadland6227 2 года назад +7

      coming fresh out of a Matlab course, this is painfully accurate. The only worse thing is trying to find a reason to use Symbolab!

    • @tobiasschafer9095
      @tobiasschafer9095 2 года назад +36

      [1 -2] is an array with two elements, [1 - 2] is an array with one element.

  • @manuillo94
    @manuillo94 2 года назад +786

    Thought he was gonna talk bout JavaScript

    • @Cow-Moth-With-A-CRT-Head
      @Cow-Moth-With-A-CRT-Head Год назад +45

      But enough about languages that suck, let's talk about JavaScript.

    • @gdmathguy
      @gdmathguy Год назад +9

      I mean... that's why typescript exists

    • @BestSuper
      @BestSuper Год назад +28

      Weird way to say python.

    • @gdmathguy
      @gdmathguy Год назад +21

      @@BestSuper wierd way to say Visual Basic

    • @Aras14
      @Aras14 Год назад

      ​@@gdmathguyDoes typescript alert you when you are making a memory safety error not documented clearly, that doesn't even give you an error massage at runtime, it just doesn't run it‽‽‽ Or can it fix self contradictory documentation?

  • @kgbman7
    @kgbman7 2 года назад +39

    Index Origin: Most languages start counting from either Zero or One. BS sets the index origin to simply -1.
    APL allows one to dynamically set and modify the index origin to either 0 or 1.
    So separate threads may have different values, or the value may vary within a loop, or different functions.
    However, if the index origin is undefined in the code, APL uses either 0 or 1 dependant on the users predefined preference, so the value will depend on who is running the code rather than who wrote it.

    • @poltergeist9972
      @poltergeist9972 Год назад +2

      Na lets start rge array at -0.5

    • @WallabyWinters
      @WallabyWinters Год назад

      ​@@poltergeist9972best I can do is -sqrt(1.01)

    • @afterthesmash
      @afterthesmash Год назад

      Conscientious programmers set ⎕IO to the required convention in local function scope. This barely dents the gyrations one performs as a conscientious shell programmer.

    • @jaycee330
      @jaycee330 Год назад

      Why start at just 0 or 1? Why not OPTION BASE 42?

    • @j.f.christ8421
      @j.f.christ8421 Год назад +1

      @@poltergeist9972 Yeah, why can't arrays be fractional anyway? That's should like a good idea to me.

  • @devonzara
    @devonzara 2 года назад +37

    Time-stamped summary of languages and a few key points in the video.
    1:23 - COBOL; Excessive Boilerplate
    2:22 - IBM COBOL; Extra Excessive Boilerplate
    2:55 - APL; Sane "Hello, World"
    3:27 - APL; Conway's "Game of Life", Use of Ridiculous Symbols
    4:21 - INTERCAL; Parody Language, Requires Correct Ratio of Politeness, No GOTO, but Instead COME FROM
    7:07 - Visual Basic; Not OOP, Basically Non-Existent Data Access Layer
    7:54 - Gupta SQLWindows; Tree-View Editor, Saved to Binary, Compiled to Byte Code
    11:33 - PHP; Ridiculous Name, Inconsistency, Variable Prefixing, Hassel of C/C++, Slow Performance
    14:38 - Python; Significant Whitespace
    17:00 - C/C++; /* Comment Syntax */
    17:41 - All Languages; null, Nothing, Nil, undefined, nada, etc.
    18:21 - Ruby; Unless Conditional Modifier
    20:11 - Greek Question Mark vs Semicolon
    21:10 - JavaScript; Senseless Equalities/Inequalities
    26:48 - Visual Basic 6; Parentheses as Array Accessors
    28:31 - C/C++; Macros
    32:43 - Flow, TypeScript, Python (Also PHP); Gradual Typing
    35:28 - Java, C, Rust; Various Memory Management Topics
    39:04 - INTERCAL, BASIC, C#; GOTO
    42:38 - BASIC; More Keywords
    43:52 - FORTH; C#, JavaScript, etc; Evaluate
    48:24 - GoLang; Date/Time Parsing Format
    53:21 - MatLab; Echos Anything That Doesn't End With a Semicolon
    54:24 - Visual Basic; AndAlso Short Circuiting
    53:43 - If Switch Statements Require Breaks, Why Not Conditionals?
    56:55 - Ruby; Optional Parentheses on Function Calls

    • @patrickelliott2169
      @patrickelliott2169 2 года назад +3

      Actually... 2:22 - speaker gets real confused and doesn't reali as that that first two, and last several, lines in his example COBOL program are JCL (job control language) which was used server side like a .bat file, to load and start the actual COBOL program, which is, for some reason embedded in it here, instead of merely referenced by it. The rest used some things li me being able to create short names for stuff like the output location, i.e. console in this case, which was added on the theory that a CNSL was several bytes shorter and thus saved huge amounts of program space. Which I suppose 'might ' sometimes matter on really old systems, with super tight memory constraints...
      In any case, JCL was intended to load "any" process/program, not just stuff written in COBOL, hence my comparing it to a DOS .bat file.

    • @patrickelliott2169
      @patrickelliott2169 2 года назад +1

      Actually... 2:22 - speaker gets real confused and doesn't reali as that that first two, and last several, lines in his example COBOL program are JCL (job control language) which was used server side like a .bat file, to load and start the actual COBOL program, which is, for some reason embedded in it here, instead of merely referenced by it. The rest used some things li me being able to create short names for stuff like the output location, i.e. console in this case, which was added on the theory that a CNSL was several bytes shorter and thus saved huge amounts of program space. Which I suppose 'might ' sometimes matter on really old systems, with super tight memory constraints...
      In any case, JCL was intended to load "any" process/program, not just stuff written in COBOL, hence my comparing it to a DOS .bat file.

    • @FlockOfHawks
      @FlockOfHawks 2 года назад

      @@patrickelliott2169 By that point i already had heard more than enough stupidity & stopped this BS video - plus it forgot Assembler

    • @nameredacted1242
      @nameredacted1242 2 года назад +4

      YOUR COMMENT SHOULD BE PINNED TO TOP OF PAGE.

  • @nobodyimportant9073
    @nobodyimportant9073 2 года назад +314

    In some math classes I would see the teacher alternate between () and [] when nesting parens. Why not do that in this language? Something like
    a = (b + 3 * [6 / (2 - c) ] ) / 7;
    If the parens don't alternate correctly, "syntax error. press any key to continue." and the compiler waits for the response before exiting, making automation of compilation just a little bit harder.
    If someone wants to add something in the middle, they have to change the inner and/or outer parens to alternate correctly.
    let's make the outermost level have to be (). That way if they want to add another level on the outside, they have to change everything inside.
    also, let's make / and * evaluate from right to left, so to get the natural interpretation they have to use parens.
    evaluate all * before all / so it's even more confusing. Cite PEMDAS if anyone gripes.
    use e as a keyword for exponentiation, but not like everyone else uses e. 1e7 should evaluate to "1 to the 7th power" instead of "10000000".

    • @rogerwilco2
      @rogerwilco2 2 года назад +27

      That is evil. This is the right addition.

    • @anonymoususer3561
      @anonymoususer3561 2 года назад +5

      That actually makes good sense, it should be like this

    • @nobodyimportant9073
      @nobodyimportant9073 2 года назад +23

      @@tabooretka Confusing things was the point. We are trying to make the worst programming language ever.

    •  2 года назад +6

      I even learned at school to use curly braces on the third level like ([{x}]).

    • @Anriuko
      @Anriuko 2 года назад +13

      Nice, but in a future revision we should consider matching different types of parens thus: (b + 3 * [6 / (2 - c] ) ]
      I would also like to see + and - have higher precedence than * and /, and - have higher precedence than +, unless we're calculating array indices in which case it's reverse.
      I also think the semicolon could be overloaded as an arithmetic operator when next to a number literal, casting the number into a semi-float. It could potentially make the language so expressive.

  • @pascalfleury8008
    @pascalfleury8008 2 года назад +58

    A few ideas:
    - have error message line numbers also made -1-based (and column position starting at the end of the line)
    - you have classes, so make the inheritance dynamic and easily overridable to any other class in the program. So you can easily access a field in a random class even if it's private, by quickly changing the base class to that, read it, and set it back to something else.
    - you did not play with #pragma... there should be one that rounds every number to an arbitrary low precision (eg. constant Real_Pi !=! 3.1 when the file has #pragma MediumPrecisionON somewhere on the top). Also, when using '#pragma SECURE' every identifier needs to have minimum 8 characters, an uppercase, a digit and a special symbol to be valid.

    • @mikewoodman2872
      @mikewoodman2872 2 года назад +4

      Sounds reasonable.

    • @RobinHillyard
      @RobinHillyard 2 года назад +11

      Yes, the language should definitely not allow immutable data types of any sort. The values of variables should spontaneously change if the programmer neglects to set them within a certain time.

    • @anomymouse5043
      @anomymouse5043 Год назад +2

      1. Error messages should be based on number of characters before (or after) the line where error occurred.
      2. R language will change the type of your variable on the fly, if it cannot process the inputs properly, say to a matrix.

    • @ahse479
      @ahse479 Год назад +1

      @@RobinHillyard this should be a well-known variable rot feature, hahaha

    • @kamil118
      @kamil118 Год назад +5

      Of course, BS is secure by default, so that's the default. You need #pragma INSECURE before declaring any identifier that doesn't meet those requirements.

  • @koszeggy
    @koszeggy 2 года назад +466

    First rule of programming: users don't like errors. In their endless wisdom, the developers of Visual Basic invented ON ERROR RESUME NEXT, which wraps literally every statement in an error handler that just silently swallows every possible exception. Even if the complete code is totally unusable due to some null reference error in the very first line, the user must not be bothered by annoying messages, especially with scary stack trace information.
    In BS actually this should be the default behavior. Though it makes it a bit harder to identify the root of the problem, the user will not freak out, maybe just notices that something is slightly off.
    Of course, there are some serious cases when crashing is the better option. So I suggest an UNLESS CRITICAL extension to the command, which may enable crashing in some circumstances. Judging the "criticalness" must be left to the executing runtime: even the same error might be considered differently, depending on some parameters such as the temperature of the CPU, for how long is the app running, etc. But even when crashing, no scary debug information must be displayed to the user.

    • @lpfan4491
      @lpfan4491 2 года назад +22

      Basically how to never find out you missed an error.

    • @gloweye
      @gloweye 2 года назад +35

      There's already a language that does that as much as possible - it's called PHP.

    • @omri9325
      @omri9325 2 года назад +3

      I think powershell has that option as well.

    • @sera5m
      @sera5m 2 года назад

      this is an amazing idea for part of this,but the second half is just ehhhhhh

    • @enverhaase8562
      @enverhaase8562 2 года назад +3

      @@lpfan4491 He said BASICally

  • @cenfraceeprivatelimited4863
    @cenfraceeprivatelimited4863 2 года назад +65

    A programmer's hell involves sitting in front of a single console running BS where the only way out of your otherwise eternal torment is writing a perfect BS compiler using BS. You don't get access to any documentation, syntax highlighting or anything. You have to work in raw text files. As a side bonus, your chair is very uncomfortable and you don't get any coffee.

    • @anon_y_mousse
      @anon_y_mousse 2 года назад +3

      I would've thought Malbolge would be the language of "choice" for programmer's hell.

    • @ixth
      @ixth 2 года назад +6

      Damn, that coffee part is truly inhumane.

    • @NoName-gd5mp
      @NoName-gd5mp 2 года назад +6

      Yes! Hell for the ones who write crappy code and don’t document, not even a comment!

    • @Skrynesaver
      @Skrynesaver 2 года назад +3

      And every 3 hours Satan calls you to a stand-up impaled-on-stakes meeting to discuss progress

    • @puellanivis
      @puellanivis 2 года назад +3

      I’ve worked on Perl coding with only notepad.exe available. I can confirm, it is hell.

  • @Majestic1987
    @Majestic1987 2 года назад +9

    You have to put in pointers as most people are really confused by them. But instead of being a variable pointing to the memory location of another variable, a pointer in BS stores the line number the variable is declared in. In order for this to work, the variables you want to point to have to have line numbers added during compile time, of course. In code, you then get the line number a variable is declared in using the FoundIn keyword.
    Dereferencing the pointer is very intuitive and works as follows:
    You create a string containing code to GOTO the line number with the variable declaration, then get the sourcecode of this line using GetCode and use RegEx to modify the line to not declare the variable but read it's value. This code is then executed using EVALUATE so you can also use pointers in a multi-threaded environment.

  • @ankursatle
    @ankursatle 2 года назад +55

    Suggestion: From Shell script, go for -gt, -eq and >, == depending on whether the comparison is numeric or not.

    • @flatfingertuning727
      @flatfingertuning727 2 года назад +4

      @@weakspirit_ In Hypertalk, the programming langauge invented in the late 1980s for use on a Macintosh program called Hypercard, there was no cleanly-identifiable distinction between strings and numbers, and the comparison operator was non-transitive. '5' > '14x' > '12' > '5'. Javascript can be about as bad when compring strings and number objects, but at least in Javascript a string comparison between "12" and "5" will report the latter as greater. In early Hypertalk, the only way to force string comparisons would be to prepend a constant to both strings that would prevent either from being interpreted as a number.

  • @karelhrkal8753
    @karelhrkal8753 2 года назад +264

    My Idea: every type should have it's own "null" type. For example: "NotString" for string, "NoNumber" for int, "MissingFloat" for floats etc. The less consistent the naming, the better. And of couse, no easy way to convert between them.

    • @rosiefay7283
      @rosiefay7283 2 года назад +8

      I think this would be a *good* idea. If it's a bad idea, is having separate 0, NULL and "" a bad idea too?

    • @unflexian
      @unflexian 2 года назад +20

      theres a general isNull function but it depends on the phase of the moon and the average temperature in mauritania.

    • @user-vn9ld2ce1s
      @user-vn9ld2ce1s 2 года назад +45

      The MissingFloat type should be just called 'Sunk' for clarity.

    • @unflexian
      @unflexian 2 года назад +13

      @@user-vn9ld2ce1s therefore the isnull function for floats should be called battleship?

    • @user-vn9ld2ce1s
      @user-vn9ld2ce1s 2 года назад +3

      @@unflexian Perhaps... Or just Get_Density()

  • @falsemcnuggethope
    @falsemcnuggethope Год назад +26

    Variables should leak out of scope like in python. By default, you will use the identically named variable from the outmost scope, but Local keyword can be used to use the innermost scope instead. Be careful not to Delete the outmost scope variable, since those scopes will start using the next outmost variable instead (which was probably the Local variable you wanted to Delete).

    • @BarryHolsinger
      @BarryHolsinger Год назад +3

      Biggest reason I hate python

    • @falsemcnuggethope
      @falsemcnuggethope Год назад

      @@SuperDudu72 pretty much, except so that it works in a way that's less logical

    • @blueflameppn
      @blueflameppn Год назад +1

      OMG this is the second least favorite Python feature of mine, after significant white space. We should definitely have it in BS, it would be brilliant!!

  • @gustavjonsson6534
    @gustavjonsson6534 2 года назад +64

    I feel like I'm in a weird limbo between Stanley Parable and Stephen Fry when watching this content. Some of the most absurd concepts delivered with a dry English comment made me laugh harder than I ever thought I would at programming! Thank you for a great presentation!

  • @SuperNicejohn
    @SuperNicejohn 2 года назад +50

    I think Lua metatables could be integrated by adding a massive amount of overhead to each memory access, and of course these should be mandatory for some obscure datatype, and extremely difficult for the programmer to implement correctly.
    Since it would be so special and would generate a much larger compiled file if it is used, why not show it's significance with, idk,
    BS_Set_META(€a,€b); and of course, since the function was broken in the first release, we need to include the fixed function as well with every release: Set_META_real(€a,€b); (!note: this one not prefixed with "BS" in order to comply with 69% requirement)

  • @augustdruzgal475
    @augustdruzgal475 Год назад +16

    During runtime, your program should initialize a "registry". Every time you create an object the program should assign it a GUID and insert it into the registry, and return the GUID value. Anything that isn't a basic data type should be stored in and retrieved from the registry, including classes, structs, and arrays, and their GUID is stored in the program using the new GUID data type. This way you can limit those annoying custom types, because they get in the way. Names and internal data are still important, though, so you can store that all as subkeys. This is great because you aren't forced to follow the defined layout of a class like all the top languages force you to, and you can even do it without defining a new class extension!

    • @joseluu260
      @joseluu260 Год назад

      Registry initializing should be done at compile time, run time would require the registry initialized. This way you can't move the compiled program to another machine unless you have the proper registry keys. Registry keys should not be grouped under a single root but rather scattered all over the place under the sha256 hash of the class (struct, array) name.

    • @augustdruzgal475
      @augustdruzgal475 Год назад +1

      @@joseluu260 I like this a lot, but I fear we need some more security and we should also require keys to use our language. We can't have random people using our language for who knows what! This way we can also include the user information in the hashing and make it so your code only runs on your computer, even if you initialize the registry keys. You know, for security.

  • @mikeciul8599
    @mikeciul8599 2 года назад +105

    Inform 7 is a "natural language programming language" designed for writing text adventure games. It was intended to be easy for people who are primarily writers and not programmers, and I quite like it despite being more of a programmer than a writer. Nevertheless, it has some very weird features:
    Identifiers may contain whitespace. It's ok to refer to a variable by just part of its name, but you do risk confusing the compiler and referring to some other variable that shares part of its name.
    To declare a variable, you give its name, its type (which is called a kind in Inform 7), and then you have to declare that it varies. If you don't declare that it varies, then you've just instantiated an object (which is called a thing in Inform 7) instead.
    A gadget is a kind of thing. [this is a type declaration specifying inheritance]
    The really keen blender is a gadget. [this creates an object]
    The nifty garlic press is a gadget.
    The rustic mortar and pestle is a gadget. [this may cause problems for the compiler because the name contains the word "and"... but maybe it won't, who knows?]
    Jenny's favorite appliance is a device that varies. [this may cause problems if there's also a thing called Jenny... but maybe it won't, who knows?]
    If you want to write a function called "it's raining" that returns a boolean, you say:
    To decide whether or not it's raining:
    "unless" is a keyword in Inform 7.
    If you want to write a function called "flush the toilet" that doesn't return a value, you say:
    To flush the toilet:
    If you want to write a function called "the favorite appliance of" that takes a person as an argument returns a gadget, you say:
    To decide which gadget is the favorite appliance of (the subject - a person):
    There's way more, but I can't even remember how it works right now...

    • @mo-s-
      @mo-s- Год назад +15

      And I thought java was verbose

    • @giuliotani4259
      @giuliotani4259 Год назад +12

      I love it already

  • @ingomancer
    @ingomancer 2 года назад +129

    I have found a bug in the BS specification. It seems you, inadvertently, allow multiple "and"s for a single do, meaning you could do 4 parallel threads like this:
    do:
    thing
    and:
    thing
    and:
    thing
    and:
    thing
    Clearly the intended syntax is to simply nestle them, like this:
    do:
    do:
    thing
    and:
    thing
    and:
    do:
    thing
    and:
    thing
    Which we can all agree is probably what you meant :)

    • @that_rendle
      @that_rendle 2 года назад +4

      Nice.

    • @AstralS7orm
      @AstralS7orm 2 года назад +12

      But they do different things! First starts 4 threads, second starts 2 threads that start 2 threads. Actually making the whole program fork at that moment would be even more diabolical.

    • @malectric
      @malectric 2 года назад +1

      It's a "feature", not a bug.

    • @АлексейСалихов-з4ч
      @АлексейСалихов-з4ч 2 года назад

      It should have been implemented as unix fork(). The program flow after fork splits into 2 threads, fork() returns zero for one thread and non-zero for the other.
      So instead of do: thing and: thing onw would write:
      thing;
      else
      thing;
      unless fork() == 0;

  • @michaeldebellis4202
    @michaeldebellis4202 Год назад +14

    I recently learned Python and I like it quite a bit. It is actually very much like Lisp, the language I’ve used the most in the past. But the concept that spaces are part of the language is something I thought was brain-dead when I first learned the language and something I still think is brain-dead. Of course, with a decent IDE, it’s easy to keep track of, but a decent IDE also makes it completely superfluous because a decent IDE can autoformat your code anyway. I still prefer parentheses or some other characters to mark beginning and end of a code block. It’s completely unambiguous and requires less effort than typing five spaces.

    • @fdfsdfsvsfgsg4888
      @fdfsdfsvsfgsg4888 Год назад

      What kind of moron actually types 5 spaces to get a tab indent? There is a lot wrong with that.

    • @bachaddict
      @bachaddict Год назад +2

      Typing five spaces sounds like a nightmare. You should try four spaces instead, pretty sure that's the standard :D

    • @arctic_haze
      @arctic_haze Год назад +2

      I agree 100%. Some time ago I needed to update a Python code without any previous contact with the language (I had worked with things like Fortran and especially C/C++ for decades). The job was quite easy but I remember that I needed to call my son-in-law (a developer) and ask him: "Is it real? Do they actually use whitespace as part of the Python language?".

  • @hummingfrog
    @hummingfrog 2 года назад +69

    I vote for invisible implicit variables, like *$_* in Perl. When reading code code you have to remember every circumstance where they might appear (or rather, _not_ appear).

    • @techgeeknzl
      @techgeeknzl 2 года назад +2

      As long as you remember to Delete it when you're finished with it, of course.

  • @ripley_hicks_newt_86
    @ripley_hicks_newt_86 2 года назад +72

    The #define with regex replacement is actually pretty ingenious. It lets you create a simple ad hoc DSL within a source file. I have use cases for that, I guess.

    • @tnspnk3
      @tnspnk3 2 года назад +8

      It's even more amusing that since you put a string after a hash symbol, the youTube analyzer is following the example of Twitter, FB, Instagram, etc and created a hashtag out of it. Clicking it in your comment opens a page of videos it thinks are related to "define". lol.

    • @achtsekundenfurz7876
      @achtsekundenfurz7876 2 года назад +25

      One dev put the following line in all of their code:
      #define is not a hashtag
      It went unnoticed until somebody introduced a variable "is" .

    • @PaulFisher
      @PaulFisher 2 года назад +1

      [squirting you with a spray bottle] No! Bad.

    • @FrankHarwald
      @FrankHarwald 2 года назад +3

      no joke: there is actually a macro assemble that has regex-based preprocessor macros.

    • @daniel.watching
      @daniel.watching 2 года назад +4

      Yeah I said the same thing. This would be pretty great. Though I think to make it more spicy, it should apply to any subsequent #defines later on. So you can use macros to write your macros.

  • @SoundsReasonable2011
    @SoundsReasonable2011 2 года назад +8

    Here are a few ideas to add:
    Bash scripting uses a wide variety of character pairs to enclose conditions - parentheses, square brackets, double square brackets, etc., and what is or isn't allowed in the condition, how you write it, and, in some cases, whether you can even do the comparison changes depending on the enclosing characters. Thus, BS unless (null) would not do the same thing as unless[null] and unless [foo == bar] might be a syntax error while unless [[ foo == bar ]] or [ foo ∙eq∙ bar] might be legal. (FYI, I used a 'bullet' character around the eq, for much the same reason you used the Euro symbol.)
    You discussed adding a required "break" statement for each scope. If a break is omitted, what happens? I would propose that execution simply continue with the next statement, ignoring whatever condition might or might not have been (intended to be) applied to it. Thus, if you omit the break statements in an 'unless' conditional, the code would act as if the 'unless' statement was not there.
    If you were to include a switch or case statement, I would suggest again borrowing from bash - their case markers are a value followed by a single ')', which makes parenthesis matching for finding errors completely useless. You could also take the case terminating ';;' and expand it to 'break break'. At the end of a case: if there is no break statement, fall through to the next case's code, if there is only one break, continue with either the case after the next case, or the otherwise case, and if you have break break, leave the entire case statement.
    I think having a 'come from' could be interesting, but it should only be allowed inside loops or conditional blocks. It might possibly be allowed inside function bodies (outside of loops or conditional blocks within the functions), but only if the source location is outside the function body, which is to say that it provides a way to jump into the middle of a function.
    Of course, there is always the Cobol ALTER statement....

    • @r.w.emersonii3501
      @r.w.emersonii3501 Год назад

      if test '$var1' -eq '' -a "$var2" == True ; then echo "$vElem=${vText[$vTeSu]:0:4}" ; fi # Welcome to bash, best language ever!
      Some languages put a number after the break, indicating the number of levels to break, so if you have a while inside of a while, break 2 would break out of both. You then get interesting effects when a new programmer takes over and inserts a for loop between the two while's! A "goto" could be used to prevent this "bug", but we all know that goto's are bad and lead to spaghetti code. I would use break 99 to be safe -- break 99 levels. An even higher number may be needed if the program goes into bottomless recursion.

    • @jambuMRT
      @jambuMRT Год назад

      [foo == bar] failing vs [ foo == bar ] working is a nice addition, but it should just be accepted with a different meaning.... like [foo == bar] is [ foo == bar ] but in global scope

  • @_fudgepop01
    @_fudgepop01 2 года назад +38

    5 amazing suggestions from the audience sounds like some sort of record. Thank you for the excellent talk Mark! I was initially afraid this would just be a repeat of the old 2014 talk but no - it (being the BS language) is far worse and the talk is far better and more refined!

  • @ErikBongers
    @ErikBongers 2 года назад +377

    I think you should add "template" before every function to make sure that compiler errors are completely undecipherable. Also, if you fail to put "template" before your function you should get a fatal warning from the compiler. Just that. "Fatal warning.". For every function definition.
    However, we are not that sadistic. You can of course turn of these irritating warnings with a compiler option. Which will implicitly put a "template" line before every function, and these extra lines are counted by the compiler so that all your compiler errors now refer to line numbers which are off by an extra line for every function in the file.
    And if you really want to win over the C++ crowd (in addition to the COBOL warriors), a BS program MUST be completely constexpr.

    • @error-42
      @error-42 2 года назад +31

      I think 'missing constant' would be a worse error message.
      Reason behind name:
      missing 'template'
      => missing nothing (no template types)
      => missing null
      => missing constant (since null is a constant)

    • @MCLooyverse
      @MCLooyverse 2 года назад +15

      Ok, but making the language strictly useless seems excessive. If everything is `constexpr`, you can't do IO... unless your notion of `constexpr` is borked, which could be a "good" feature.

    • @Expllosaoriginal
      @Expllosaoriginal 2 года назад +2

      @@MCLooyverse the language has functions, it should be enough for IO with constexpr

    • @MCLooyverse
      @MCLooyverse 2 года назад +1

      @@Expllosaoriginal No, you can't have a constexpr side-effecting function. Those are antithetical.

    • @nintendoeats
      @nintendoeats 2 года назад +4

      The problem with forcing everything to be constexpr is that you would then know what's going on. You know that your output binary will always return a single value and close, so deciphering the code is about figuring out what the value is.
      constexpr generally makes code simpler, since it explicitly PREVENTS you from writing code with some clearly defined properties (being determinable at compile time). A bad language is one that lets you do lots of horrible things, but prevents you from doing seemingly normal things with no rhyme or reason.

  • @undercrackers56
    @undercrackers56 Год назад +1

    After 40 years of writing software I can attest that Academics and Mathematicians should never be allowed in the design of programming languages. Logo is a terrible implementation of a good intention. Current C++ is a nightmare complication of a great idea. NodeJS is under planning extended to insanity. Python is bureaucratic punishment of programmers.

  • @shannonpekary7757
    @shannonpekary7757 2 года назад +14

    I recently began programming an embedded system using Zephyr RTOS. Its been a while since I have setup a C build. I had to review the Make language, learn about CMake and Ninja, that build Make scripts, then learn about West to build Ninja scripts and KConfig for build configuration. On top of that, Zephyr has decided to borrow Device Tree from Linux to configure boards (because of course everyone knows about Device Tree), but to get the device tree configuration actually into the C code, drivers need YAML files as glue. The device tree files create macros that are nested many levels deep, so that whenever there is a problem, you get an error like: 'PINCTRL_STATE_DT_N_S_soc_S_pwm_40021000_PINCTRL_IDX_0_UPPER_TOKEN' undeclared here (not in a function); did you mean 'DT_N_S_soc_S_pwm_4001c000_PINCTRL_IDX_0_UPPER_TOKEN'?
    So, for BS I propose a separate language called CRAP (Configuration Reader And Prognosticator) to do build configurations, Wipe to cleanup build artifacts so they don't get checked in to the repository, and Toilet as the name of the compiler. Of course, all CRAP options are declarable on the Toilet command line, but formats are completely different. And, we need a name for the "ecosystem". How about Septic?

  • @retinafunk
    @retinafunk 2 года назад +64

    As a coder since 1995 I was crying tears .. best stand up comedy for code nerds

    • @NoName-gd5mp
      @NoName-gd5mp 2 года назад +3

      Absolutely. A real draw to get coders to conferences. A head liner….can you tell I am an ex programmer who slipped into marketing dev tools? Hey, I am always trying to convince business degree marketers WHY they can’t use “user friendly” in every single ad…to use info that has context.

  • @punklejunk
    @punklejunk Год назад +5

    Do not let the lovely British accent deceive you. This man is creating a monster right in front of you by combining every ugly conceivable feature you could possibly hate. He tells you he will concoct a terrifying, brilliantly horrible FrankenZombieLanguage, and he even gets the audience to help. I am suddenly applauding him for showing what kind of bastards live in this world, who will directly harm mine. He is the John Oliver of coding.

    • @m4inline
      @m4inline Год назад +1

      Right? This guy should be flagged as an enemy of the state!

  • @Novabomb85
    @Novabomb85 2 года назад +160

    I thought of something perfect to add. TCL has this feature called "upvar" that lets a function access the scope of the function that called it. It can take a number parameter to access higher levels of the call stack.

    • @Vikezor
      @Vikezor 2 года назад +27

      what's upvar

    • @user-ym2mp4jh2c
      @user-ym2mp4jh2c 2 года назад +47

      @@Vikezor Nothing much, what about you? :D

    • @Vikezor
      @Vikezor 2 года назад +7

      @@user-ym2mp4jh2c aaaa e

    • @JamesKaraganis
      @JamesKaraganis 2 года назад +2

      Internet won.

    • @jimtrela7588
      @jimtrela7588 2 года назад

      Is that similar to a "thunk" in Algol 60?

  • @TheSulross
    @TheSulross 2 года назад +160

    there seriously is a bs language - developed by someone at AT&T Bell Labs back in the 70s. Can kind of think of it as the Perl of the 70s. But seems to not gotten any traction and faded into obscurity.
    I have a 9 page manual for it: "Bs is a remote descendant of Basic and Snobol4 with a little C language thrown in. Bs is designed for programming tasks where program development time is as important as the resulting speed of execution. ..."

    • @fllthdcrb
      @fllthdcrb 2 года назад +9

      Interesting. Apparently, at one point UNIX featured bs as a language on par with C, Fortran, and assembler.

    • @TheSulross
      @TheSulross 2 года назад +4

      @@fllthdcrb SNOBOL4 was big on the IBM mainframes like the 360. It came out in mid 60s (in a portable version that ran on a virtualized machine - implemented with assembler macros). It was adept at string pattern matching so it may very well be the granddaddy of regular expression grep-like libraries and tools
      and clearly, per that blurb in the BS manual, the folks at AT&T Bell Labs were aware of SNOBOL4 so perhaps that is indeed what they drew on as inspiration for the the regular expression capabilities that they made famous in tooling, libraries, and languages (well, Perl was Unix inspired and had integral regular expression capability)

    • @walterpinkus5534
      @walterpinkus5534 2 года назад +2

      @@TheSulross SNOBOL4 was a useful language - once you got your head screwed around enough to deal with its syntax and got used to the 'space' as being a significant character. I think the Griswold, Poage, Polonsky SNOBOL4 manual was the worst I've ever encountered: useful only if you are already intimately familiar with the language. I spent a lot of time reading the Index line by line, looking for something suggestive of of what I thought I needed.

    • @TheSulross
      @TheSulross 2 года назад

      @@walterpinkus5534 I recently listened to a podcast on SNOBOL and it seems it was mainly a thing on mainframe computers back in the day. The Unix world developed it's own approach to reg-ex tools and capabilities (unclear if they drew on inspiration from SNOBOL - which had been around since the 60s) and that heritage for reg-ex text processing is what survived into the contemporary computing landscape

    • @billkeithchannel
      @billkeithchannel 2 года назад

      A lawsuit already.

  • @asperspec9956
    @asperspec9956 Год назад +4

    Aw man, I was waiting for Perl's contexts. You know, when operators such as ASSIGNMENT mean different things depending on context, which is implicit and inferred.
    This is the best comment section I've seen in years!

  • @berighteous
    @berighteous 2 года назад +16

    My first computer job was translating 1960's APL code from printouts and program outputs to applesoft Basic. I was 18 and had no idea about APL, but I BS'd my way into the job and they gave me a 5ft high stack of printouts and a APL textbook from the 1960's. That paid for my first 2 years of college.

  • @KaneYork
    @KaneYork 2 года назад +43

    The original "goto considered harmful" paper was, in addition to other things, asking people to stop jumping between methods with their gotos.

    • @anon_y_mousse
      @anon_y_mousse 2 года назад +11

      The problem is that many people took it as a blanket no. For certain types of code, such as error handling or nested loops, using goto can make your code cleaner and more efficient. Nearly all things in life should be done in moderation. /* There are exceptions, of course. Like always comment your code, but not every line. */

    • @wimahlers
      @wimahlers 2 года назад +1

      ​@@anon_y_mousse
      Ironically, COBOL has the more elegant and more structural "continue" (and "next sentence") statement replacing the more unstructured and more error prone "go to" statement within iterations.
      COBOL also has a more structural "evaluate" statement solving multiple elseifs with multiple complex condition statements.
      Unknow for those who never coded COBOL, it has been the stable and reliable backbone language of the financial world. It might still be, I don't know, I haven't programmed COBOL for over 20 years.
      p.s. I also used to be a Java programmer.

    • @anon_y_mousse
      @anon_y_mousse 2 года назад +1

      @@wimahlers Interesting, although C does have the continue keyword as well. It's just not enough in certain circumstances. Like if you want to break out of an inner loop and you haven't yet met the condition of the loop, and you can't modify what it's testing to do so.

    • @wimahlers
      @wimahlers 2 года назад +3

      ​@@anon_y_mousse
      In COBOL there are keywords for that as well. Namely:
      "next" to exit all nested loops.
      "exit perform" to break out an inline perform loop.
      As always, use all code statements, especially statements breaking the flow of processing, in a sensible way.

    • @philrod1
      @philrod1 2 года назад

      I always stay clear of GOTO for two reasons. First, I always assume I'm leaving behind a mess; and second, it seems a bit rude. The second on also applies to returning early from inside a loop.

  • @stesilaus1688
    @stesilaus1688 2 года назад +15

    Who would have thought that a Computer Science conference could be so genuinely entertaining? Well done, Mr Rendle!

    • @Pozi_Drive
      @Pozi_Drive 2 года назад

      Check out the Niklaus Wirth talks

  • @charliedobbie8916
    @charliedobbie8916 2 года назад +55

    Can I just say that pluralizing a data type to indicate an array is about the most wonderful concept I've ever heard of. Bravo!

    • @grantofat6438
      @grantofat6438 2 года назад +2

      That is pretty much standard.

    • @DMoberg
      @DMoberg 2 года назад

      But what would you do if the plural clashes with the singular of another word?

    • @cFyugThCzvAqYaGmxRgfCKTuvHMEjQ
      @cFyugThCzvAqYaGmxRgfCKTuvHMEjQ 2 года назад +7

      We should do multidimensional stuff. Like a framebuffer with individual colors would be of type Bytesss

    • @cFyugThCzvAqYaGmxRgfCKTuvHMEjQ
      @cFyugThCzvAqYaGmxRgfCKTuvHMEjQ 2 года назад +1

      @@DMoberg this happens in matplotlib documentation. It has a type Axis and a type Axes

    • @gregf1299
      @gregf1299 2 года назад

      could be very powerful. And the plural of "sheep" would be "sheeps", in this case a two dimensional array (due to the collective noun).

  • @Batgame_1
    @Batgame_1 2 года назад +26

    My own code suggestion:
    In Rockstar, you can declare a variable with a space in it (space case, if you will), so no need for snake_case or camelCase

    • @slashrjl
      @slashrjl 2 года назад +2

      Fortran also allows spaces in variables, though it is not significant. FOR 10 I is a valid variable..

  • @fdagpigj
    @fdagpigj Год назад +2

    btw brackets on function calls in ruby are not optional only in case you're not passing any params, they're *always* optional, and not only that but squiggly brackets around hash literals are optional (and not only that, functions do not support keyword parameters), so eg. "foo 1, 2, 3, a: b, c: d" is actually "syntactic sugar" (more like syntactic acid) for "foo(1, 2, 3, {a: b, c: d})"

  • @EvangelosLolos
    @EvangelosLolos 2 года назад +130

    A Greek semicolon is actually just the top dot from :
    I think a better option would be to combine with Spanish and always pair punctuation with the opening mark being upside down 🤣

    • @reinei1
      @reinei1 2 года назад +7

      Even better:
      Make it MatLab (but in Spanish) (yes, that's it's actual name "MatLab (but in Spanish)")
      If you forget either the opening or closing punctuation (unless constructs require one at the very start and at the very end) the ENTIRE construct is evaluated and printed before the condition is evaluated and the branch taken is evaluated a second time (including all side effects)
      Open questions:
      What happens if there are early returns in either of the branches?
      What happens to Delete's in either branch?
      Bonus points:
      FOR EACH missing punctuation both branches are evaluated and printed...
      Missed the first? That's 1 evaluation for both + 1 for the branch actually taken
      Missed both? That's 2 (!) evaluations + 1 for the actual branch!

    • @samiraperi467
      @samiraperi467 2 года назад +3

      @@reinei1 Matlab (but in Spanish) sounds like Excel macros.

    • @puellanivis
      @puellanivis 2 года назад +1

      ¡This is brilliant?

  • @charlesstaats9902
    @charlesstaats9902 2 года назад +17

    From TeX: There’s a special “expandafter” macro that causes the macro engine to temporarily skip the next token. If you want to skip more than one token, you have to use additional expandafters (since expandafter is a macro, you can apply it to itself).

    • @rosiefay7283
      @rosiefay7283 2 года назад +1

      And if you want to do the action n times, you have to use 2^n-1 copies of the token in your code.

  • @notalizardperson
    @notalizardperson Год назад +2

    You know, if I were designing a language, I would want to make sure the programmer knew what they're doing, so I would require every translation unit to have a declaration that the programmer knows what they are doing. As duplicating that string would suggest the programmer is simply copying and pasting solutions they found on stackoverflow, each declaration of correctness should be distinct at both compile and link time. Runtime checks should ensure those statements of correctness exist by verifying them against a correctness revocation list. Additionally, every compilation of the translation unit should revoke the previous declaration and require a new declaration to be made. To make sure the programmer doesn't lie, this will require a code signing certificate and they will have to register with the Program Correctness Registry and pay a small annual fee.

  • @perj6628
    @perj6628 2 года назад +58

    This is such a fun talk! I could be wrong, but I believe you've introduced a memory leak in your Say function. You're not deleting the €things variable. 😉
    C# also has the confusing "skip parentheses" on object initialization if you use curly braces and set some properties instead.

    • @emilivanec
      @emilivanec 2 года назад +2

      Well no one mentioned VB6 END statement , good luck finding that in code

    • @metaltyphoon
      @metaltyphoon 2 года назад +1

      You can only “skip parenthesis” on object initialization when you don’t define a constructor.

    • @that_rendle
      @that_rendle 2 года назад +9

      You're right, I absolutely did. On purpose, of course, to see if you were paying attention :P

  • @Metruzanca
    @Metruzanca 2 года назад +24

    "Business people can't describe the applications they want, much less write them" Yup. I laughed at that.

    • @NoName-gd5mp
      @NoName-gd5mp 2 года назад +2

      This is universal in anyone trying to translate from one profession to another. For years, I translated between embedded HW and SW groups. The schism was unexpected. Someone has to bring up the first silicon board…with what? Basic understanding on both sides should be required training. SW folks always had to fix HW screw ups and were always expected to make up for time lost by slow HW. Unfair, and I was always defending the SW release slippage.

    • @ClemsonTiger75
      @ClemsonTiger75 2 года назад

      LOL - spot on. It was like pulling teeth to get someone to describe what they actually wanted.
      Typical meeting with requestor: Do you need sub-totals? uh - yes I guess so. How about totals? Uh - yes that too. Page breaks on Division changes? Oh yes - gotta have those. Sort order? uh - what do you think? Me? It's not my report. Uh, well, I'm not sure that I understand Sort Order. Exactly what do you mean by that? I tell you what I'll do. I'll just design this report that I think you might possibly want, and then we can just keep changing it until it makes sense to you. GREAT!! You da' man. I'll call you when it's ready. Bye.

    • @johnscoone9310
      @johnscoone9310 2 года назад

      Actually they can describe them. They just can't write them up.

  • @ironsand
    @ironsand Год назад +2

    This Dynamic x Static typing is an outdated conundrum. The thing these days is the Dynastic typing, in which your variable types can change when they are overthrown by a new and stronger heir type!

    • @the11382
      @the11382 Год назад

      It should only happen if the new value is "better", as if the new value has to beat the old value in gladiatorial combat. Does "hello" get defeated by "goodbye", who knows?

  • @danielelupo5224
    @danielelupo5224 2 года назад +54

    This video should be used in job interviews when you're looking for a software developer. The more the candidate laughs, the more he knows how to code properly...

    • @StandaBlabol
      @StandaBlabol 2 года назад

      Frankly, it is not funny.
      It is just true.

    • @MarquisDeSang
      @MarquisDeSang 2 года назад +1

      An assembly programmer would not understand any of this. The fact that his code ask to Delete local variable is proof that he does not understand how things actually works underneath. local variables are on the stack they don't get deleted, just ignored and overriden eventually. When you sp = bp (stack pointer = base_pointer) nobody cares it is a stack.

    • @wimmooij1236
      @wimmooij1236 2 года назад

      Any suitable candidate should be able to recommend at least one element to add to BS to improve it in line witb its stated opjectives

    • @dave7038
      @dave7038 2 года назад +1

      @@MarquisDeSang Perhaps the requirement to Delete local variables is a security feature, it overwrites the data just in case you stored anything sensitive there.

    • @MarquisDeSang
      @MarquisDeSang 2 года назад

      @@dave7038 Yea a random sequence of numbers written on the paramaters of the stack multiple times to wash sensitive "counters values" before exiting. Brilliant. lol

  • @franckhorlaville6768
    @franckhorlaville6768 2 года назад +58

    Absolutely brilliant!
    Could I suggest adding from PL/1 (coming from Fortran if memory serves): implicit typing based on the first character of the variable name (which is why for loops traditionally use a lowercase "i" as it was the first short int available)

    • @YumekuiNeru
      @YumekuiNeru 2 года назад +13

      also Fortran's implicit save. If you assign a value to a variable on the same line that you declare it, the variable is given the save-attribute. This is basically the same as a static variable, so it will not be reinitialized on the next function call.

    • @mikewoodman2872
      @mikewoodman2872 2 года назад

      Sounds reasonable.

  • @beyondcli
    @beyondcli Год назад +3

    The "IBM Cobol" example presented at 2:35 was not making Cobol "worse", it is an example of compiling and running the program using JCL (Job Control Language) with the source code included (wrapped) within the JCL. Alternatively the program could have been compiled seperately and referenced with just a few lines of JCL. The COBUCLG procedure referenced on line 2 performs Compile, Link-Edit, and Execute of Cobol Source code inline or in a referenced dataset. A modern analogy is a makefile together with source code required to compile an application on Linux.

    • @PlayWithYourThumb
      @PlayWithYourThumb Год назад +1

      I'm not sure if he is truly ignorant or just pitching to "his" audience ie: people who wouldn't know a mainframe if it bit them on the arse. Runtime compilation was banned where I used to work, it was considered a security risk. He clearly doesn't know about the COPY and INCLUDE statements.

    • @that_rendle
      @that_rendle Год назад

      @@PlayWithYourThumbI’m truly ignorant

  • @matyskal
    @matyskal 2 года назад +62

    I love this video. I have some suggestions:
    Using infix notation in BS is too much polite I think. The postfix notation is just for BS!
    So, the "unless €i < 1 break;" should be written as "unless €i 1 < break;"
    Also, using '' signs is too much readable, the bash "lt" and "gt" is more appropriate, so the "unless €i < 1 break;" will be written as "unless €i 1 lt break;"

    • @dave7038
      @dave7038 2 года назад +9

      I came to the comments to look for the 'no infix' suggestion :D
      lt/gt is good, but too easy to type, I suggest < and >.

    • @Scriptease1
      @Scriptease1 2 года назад

      Or yoda style: Break unless less than is 1 it

    • @stnhndg
      @stnhndg 2 года назад

      Polish notation lovers? Great great!

    • @EvileDik
      @EvileDik 2 года назад

      RPL for any mathematical expression, infix for string manipulation and prefix for array manipulation.

    • @isodoubIet
      @isodoubIet 2 года назад

      Postfix notation (RPN) is too familiar to users of graphing calculators and happens to be the natural sentence order for several human languages, including Japanese, Latin, Turkish, some constructs in Romance languages, and so on. Make it prefix notation instead, after all, you have to know what operation to apply things to before knowing those things, right?
      + - 20 * 3 4 1 = 9

  • @roelbrook7559
    @roelbrook7559 2 года назад +14

    I thought this video would be 15 seconds long. Someone comes up on stage, yells "Java", gets his applause and leaves. Glad there was a bit more depth :P

    • @SpringySpring04
      @SpringySpring04 2 года назад +3

      No they should go up there and yell "python" lmao

    • @impactsting
      @impactsting 2 года назад

      Needs more checked exceptions

    • @emuhill
      @emuhill 2 года назад

      I think APL and Forth are far worse than Java. Both of those programming languages were kind of eccentric.

  • @thomashurley5388
    @thomashurley5388 Год назад +1

    In high school, we used RPGII. In this, you needed to make sure you reference the type of line that was programmed in the specified column. I think it was column 6. These were H (Header), F(File), I(Input), E(Exception), C(Calculation), O(Output).
    Because this was used on the IBM System 34, we needed to reference where the character started and its length.
    Each item still needed to be in their proper columns as well, since this was designed to be used with punch cards.
    Including some of these features in BS would be nice. To convey further annoyance, add contractions like shouldn't. Require long statements to have furthermore, which must be referenced using a combination of superscripts and subscripts.

  • @GraemePayne1967Marine
    @GraemePayne1967Marine 2 года назад +58

    Absolutely the most hilarous hour I have spent since I was first exposed to programming languages, some 48 years ago! Thank you for the overview of this fantastic programming tool, BS!

  • @SnowSleetCoGaming
    @SnowSleetCoGaming 2 года назад +12

    This is one of the best conferences I've ever sat through. I do not regret watching this in the slightest.

  • @grnphroggy
    @grnphroggy Год назад +2

    I believe PowerShell is the language you were trying to think of around 58:20. It uses -gt and -lt operators, and variants -gte and -lte as well as -eq and -ne, for comparisons. This is because PowerShell is intended as a shell replacement (think bash, or the MS-DOS command prompt), so it uses > to redirect output to a file.

  • @scoutchorton
    @scoutchorton 2 года назад +31

    Here’s a couple features from TI-Basic that I enjoy (the language of the Texas Instrument graphing calculators):
    1) Variable assignment is right handed (value -> var)
    2) You need opening parentheses (for anything), but closing parentheses are optional if at the end of a line (I believe in certain contexts too, like a list would be { 1, 2, 3 -> L1)
    TI-Basic also has 1 indexed lists, which makes it even better
    I think the thing that would make this aggravating beyond anything is just to break as many conventions as possible. For example the white spacing is just so common that the was BS breaks it makes it aggravating. Any convention that would make switching languages easier should be ignored and go in the other direction.
    Also CoffeeScript actually has some features that are syntactic sugar (which includes unless), but also allows for really lazy programming habits. When I’ve written in CoffeeScript, I generally utilized those shortcuts and it makes code so much harder to read

    • @puellanivis
      @puellanivis 2 года назад +4

      I’ve worked with a _lot_ of Perl (enough Perl that I’ve seen good Perl). And it had `unless` keyword as well. I generally liked how you could make a piece of code clearer sometimes by choosing one option over the other, but at that point, it becomes as much of a craft as writing good prose for documentation. It really stuck with me that “with great power, comes great responsibility” because like… yeah, it was powerful, but you had to use it sparingly, and only where it made things more clear rather than less clear.
      Now, I program mostly in Go, and I much prefer the cookie-cutter one-way-to-do-things attitude. Doing similar things always looks similar, which is desirable in a programming language. We don’t need suspense, narrative flourish, and twists in our programming languages, like we prefer in our prose.

    • @BMoser-bv6kn
      @BMoser-bv6kn 2 года назад +1

      Didn't need closing quotation marks, either. Just imagine the trillions of precious, precious finite bytes being wasted on such luxury.

    •  2 года назад +1

      @@puellanivis Perl's TIMTOWTDI sounds like a nice idea, but in practice most shops surely had coding guidelines that boiled down to something resembling Python's "There should one - and preferably only one - obvious way to do it." Because "readability counts" ;-)

    • @puellanivis
      @puellanivis 2 года назад

      @ indeed. “use strict“ was in particular a requirement at the position I was in, and that was kind of just the tip of the iceberg.

    • @cQunc
      @cQunc 2 года назад +1

      On the topic of breaking conventions: swap the meanings of '=' and '==' (but only in conditionals).

  • @christiangottlieb9672
    @christiangottlieb9672 2 года назад +13

    Another freakish one, even if a bit arbitrary:
    Word usually only has simple statements using logical formulars and strings, but can handle nested code by passing it as a string parameter. Though to identify this, the code needs to be capsulated in curly brackets. It aren't your normal curly brackets though, you need to press Ctrl+F9 and it will create a "this is code" marker in the background that you can not copy paste and looks identical to a pair of bold curly brackets. Which will for eternity not only disrupt any attempt to use stack overflow for these formulars, but also force every developer to explain this behaviour in every comment they make if they want to help people online.

  • @autarchprinceps
    @autarchprinceps Год назад +3

    I once got a Java codebase that used throw & catch to pass messages between different parts of the programm. It was never run for very long, but once we did, we eventually got an exception queue out of bound exception, which is not catchable, since the exception queue is already full. To fix that issue, you just have to rewrite the entire structure of the programm your working on to not do that, so that was a fun project. I was meant to just add IPv6 support (yes they were doing network testing with Java, don't ask).

  • @vikumwijekoon3166
    @vikumwijekoon3166 2 года назад +12

    Since the language is pass by value, you can make it so that the objects are only shallow copied and you have to by hand deep copy the object in every method to make it work because without it, delete would also delete passed value and the return value of the method since its only shallow copied.

  • @FatihKarakurt
    @FatihKarakurt 2 года назад +30

    You should have made the label numbers for goto statement real line numbers so that anytime the file is edited there would be a chance of revising them all.

    • @shieldanvilitkovian9541
      @shieldanvilitkovian9541 2 года назад +5

      That's where I thought he was going with that, with the addendum that if a labeled line number doesn't have a goto statement or it's unreachable, the compiler will throw an error.

    • @czbuchi86
      @czbuchi86 2 года назад +6

      @@shieldanvilitkovian9541 why throwing error? just continue program from that point

    • @alainzscheile6913
      @alainzscheile6913 2 года назад +2

      just require that gotos can only be used on line numbers where the line number module 42 is zero, but Delete lines aren't counted.

    • @SkepticalTraveler
      @SkepticalTraveler 2 года назад +1

      @@shieldanvilitkovian9541 Why allow labels at all? Any gotos (or comefroms) should reference just line numbers. After a few edits there will be no way to tie the line number references back to the original lines they were meant to reference. Also, any lines that are entirely commented or entirely white space shouldn't count towards the line number count.

    • @dfeuer
      @dfeuer 2 года назад

      I think it's important to bring LaTeX into this. There are some "fun" problems you can get into where the size of a forward reference to something changes what page that appears on. You can end up failing to reach a fixed point and have to reformat or reword some random text to make it work.

  • @fdagpigj
    @fdagpigj Год назад +3

    When you were getting to comments, I thought you were going to take inspiration from CSS, which has no inline comments, ONLY block comments, which is tolerable right until you ever need to comment out a block of code which just so happens to contain a pseudo-inline comment... because the end of that comment is interpreted as the end of the outer comment block, since block comments are not like brackets, they don't need to be followed by equally many corresponding beginnings in order to end, they'll always end on the first one.

  • @wolfelkan8183
    @wolfelkan8183 2 года назад +10

    12:33, another explanation I thought of: PHP stands for Hypertext Preprocessor. However, the "pre" gets moved to the beginning, because that's what "pre" means.

  • @sniperwolf50
    @sniperwolf50 2 года назад +34

    To be extra evil, you could take a page from HDLs like VHDL and Verilog, where everything is concurrent unless explicitly noted, and have blocking and non-blocking assignment statements.
    Yes, for their intended purpose, these features make perfect sense. Not so much in an ordinary programming language

    • @adissentingopinion848
      @adissentingopinion848 2 года назад +4

      No, no, don't even suggest it! Verilog already has a fuckton of race conditions because of that (testbenches, mostly)! Just save them the trouble and turn half the language into stuff that can't be synthesized, and yes, we'll call compilation synthesis because fuck you, that's why.

    • @talkysassis
      @talkysassis 2 года назад +5

      My teacher was a developer of verilog (not a developer who uses verilog, he developed the verilog itself) even he said that verilog was a mess to use.

    • @stevenclark2188
      @stevenclark2188 2 года назад +2

      Or it should be like make and have a separate use of equals that assigns an expression tree instead of a value to a variable. Not quite a function, but almost.

    • @PaulFisher
      @PaulFisher 2 года назад +2

      VHDL! A good feature to take from there would be the BEGIN / END pairing, along with the requirement that some blocks end with “END [block type]” but other blocks end with “END [block type] [name]”.

    • @anon_y_mousse
      @anon_y_mousse 2 года назад

      @@PaulFisher To take it a step further, some blocks would end with just "END" and some would end with the type of block written backwards. You can thank bash for that idea, only it'd be like while ... elihw or unless ... sselnu;

  • @rpocc
    @rpocc 2 года назад +3

    One more beautiful code design suggestion adopted from Arduino:
    instead of a=b you put assignValue(a, b->value()), and moreover, the HelloWorld project should include a builtin initialized 4GB of memory for buffers and predefined one-letter variables.

    • @j.f.christ8421
      @j.f.christ8421 Год назад

      Arduino is just C++, it doesn't have assignValue(). MatLab does though.

  • @Nickps
    @Nickps 2 года назад +7

    Just a small correction on the Greek language part: The Greek semicolon is actually just the top dot of a colon or question mark. Like this: · (with my font it actually appears at the wrong height). It's literally called the "upper dot" in Greek.

  • @Scriptease1
    @Scriptease1 2 года назад +15

    Another idea from html, if you have a old school table and you put any tag between the table and the cell it moves the code outside on top of the table.
    Maybe the compiler can detect if you are using some code in the wrong place and moves it to the top of the function for you.

    • @techgeeknzl
      @techgeeknzl 2 года назад +4

      The compiler should do that for _all_ syntax errors. Move the code by a random number of lines (backward or forward), randomly adjusting indentation as required, until it succeeds at compiling the code. To ensure is always succeeds at compiling, a bug in the indentation-repair logic sporadically converts code into comments and vice versa.

    • @unfairlive2
      @unfairlive2 2 года назад +1

      @@techgeeknzl Best part is that way you won't get an error log about meaningful things, but you can still claim (and prove) that your compiler does in fact have error handling. You can thus make very elaborate and fancy error handling. In the safe knowledge that your compilor will do whatever it can to compile succesfully, and thus never actually give an error.

    • @dave7038
      @dave7038 2 года назад +2

      You touch on an important point here, in order to target a wide variety of output file generation (for producing HTML pages for example) BS should support some form of in-line templating where you can mix BS and plain text.

    • @Scriptease1
      @Scriptease1 2 года назад +1

      @@dave7038 and let the programmer include page numbers like '1 of 16' right aligned with spaces manually but checked at compile time

    • @sayven
      @sayven 2 года назад

      Reminds me of that one JS framework that fixes your typos in variables

  • @CV_CA
    @CV_CA Год назад +2

    1:36 I took one semester of COBOL. Still missing that 3 months of my life.

  • @RonNewsham
    @RonNewsham 2 года назад +26

    One thing that I remember from 1970s was writing programs at home on a vintage manual typewriter and taking them into school to type on a teacher's TRS-80
    Such typewriters do not have keys for digit 0 (use uppercase O) or 1 (use lowercase l) so a BS language should not allow those either.
    My other thought was to consider operator precedence and evaluation order, make the precedence equal and evaluate right-to-left.
    Personally I would also limit a compilation unit to 132 characters by 66 lines so it will fit on a page of lineprinter paper. You may want to reduce the line count to 60 to allow a page header and footer.

    • @ronb6182
      @ronb6182 2 года назад

      You mean trash 80 by Tandy. 73

    • @ronb6182
      @ronb6182 2 года назад

      IBM had 132 spaces plus carriage control. 73
      e

    • @OlafoWaffle
      @OlafoWaffle 2 года назад

      Why not spice things up and require certain sections to be loaded via punch card or tape?

    • @ronb6182
      @ronb6182 2 года назад

      I always liked the 133 spaces I know modern needs to be reduced I think 80 spaces is small enough. You can put your own margins in if you want I would use 5 spaces on each end and have 70 to work with. 73

    • @ronb6182
      @ronb6182 2 года назад

      @@OlafoWaffle yeah if you have the hardware to run such a program. Most are emulators these days. Even back then emulators were used for machine code. 73

  • @romanhimmes171
    @romanhimmes171 2 года назад +46

    C++ has, depending how you count, up to seven methods of variable initialisation. So I suggest that BS is having also a variety of methods. Additionally, because we strive for a more diverse society, BS should have quotas for each of the method so that no one method is used excessive more than the others.

    • @ankursatle
      @ankursatle 2 года назад +2

      Yes, we should encourage copy pasting instead to bury ourselves in! Brilliant idea! 👏🏻

    • @MasterHigure
      @MasterHigure 2 года назад

      Unfortunately for your diversity, kindof the point of this talk is to take things that already exist, possibly with some tweaks. I don't know if a language that keeps track of how many times a function is called, and cares about it.

    • @romanhimmes171
      @romanhimmes171 2 года назад

      @@MasterHigure yes, you are right. It is off topic

    • @leogama3422
      @leogama3422 2 года назад +2

      This is an actually funny diversity policy joke

  • @travisty222
    @travisty222 Год назад +1

    In the threading example, you didn't `Delete €‎things`
    At the same time, in the threading, would €‎i need to be Deleted for each thread too? I assume `i` would be copied in this case

  • @Ctl-F
    @Ctl-F 2 года назад +8

    I want to see a dash of assembly. Where you can declare variables but in order to use them you need to load them into registers

    • @that_rendle
      @that_rendle 6 месяцев назад

      I’m thinking the next version will only compile to WASM and will allow inline WASM like C allows inline assembler.

    • @that_rendle
      @that_rendle 6 месяцев назад

      I’m thinking the next version will only compile to WASM and will allow inline WASM like C allows inline assembler.

  • @marco_foco
    @marco_foco 2 года назад +19

    I don't know if it was made up, but at about 34:00 "localization" is mentioned. If I remember correctly it has really happened, I believe it was in Excel 5.0: at least in the Italian version all the keywords were translated, and being the program tokenized to begin with, you could still load and execute the code, but as soon as you started editing the program, all sort of problems would arise if a variable written in "english" VBA was clashing with an "italian" keyword.

    • @genroa3881
      @genroa3881 2 года назад +2

      This is still a problem with C# where a code containing a float parsing from a string will or won't work depending on your local culture by default, unless, each time you call it, you specify that you want the parsing to be culturally invariant. The old SHAPEFILE format also has the kind of problem with the ArcGIS software.

    • @monsterfurby
      @monsterfurby 2 года назад +3

      I'm a data analyst in a multilingual company and also happen to be "the guy who can fix Excel problems". Every time someone with a non-English or German operating system mentions Excel/VBA issues, I just wake up fifteen hours later with a hangover, crying in a corner.

    • @marco_foco
      @marco_foco 2 года назад

      @@genroa3881 Oh, I know, I know... I hit that problem around 2007, and I had to stuff a program of CultureInfo.InvariantCulture

    • @marco_foco
      @marco_foco 2 года назад

      @@monsterfurby I feel your pain...

  • @danielrhouck
    @danielrhouck 10 месяцев назад

    Ideas:
    - Use OrElse keyword is used in some sort of error handling. Do OrElse, and the program panics if fails. Yes, I know that OrElse was suggested as short-circuiting Or operator. It’s *also* this.
    - C++ templates are Turing-complete. I don’t remember if you covered generics except in an aside about Go, but if you can have generics, they should also be Turing-complete but in a more awkward way.
    - Lots of languages are getting support for running near-arbitrary code at compile time. This is good, but you can go further. Also allow I/O at compile time.

  • @windowsunknown
    @windowsunknown 2 года назад +18

    I think in an older version of C, it required all variables to be declared up front. So for BS, variables must be declared every 3rd iteration of line 42

    • @cquezel
      @cquezel 2 года назад +2

      I think we can make better use of number 42.

    • @techgeeknzl
      @techgeeknzl 2 года назад

      @@cquezel All variables, including globals and nested scopes, have to be redeclared exactly 42 lines after their inception, with a `stillUsing` keyword; so the compiler knows you haven't forgotten about them.