this post was submitted on 19 Jun 2025
323 points (90.3% liked)

Programmer Humor

24373 readers
898 users here now

Welcome to Programmer Humor!

This is a place where you can post jokes, memes, humor, etc. related to programming!

For sharing awful code theres also Programming Horror.

Rules

founded 2 years ago
MODERATORS
 

Made with KolourPaint and screenshots from Kate (with the GitHub theme).

you are viewing a single comment's thread
view the rest of the comments
[–] [email protected] 17 points 2 days ago (4 children)

I don't understand how not using a keyword to define a function causes the meaning to change depending on imports. I've never run into an issue like that before. Can you give an example?

[–] [email protected] 13 points 2 days ago (3 children)

Some declarations terminate on the name, other declarations go one requiring more tokens. In C, the only thing that differentiates them is the type.

Parenthesis in particular are completely ambiguous. But asterisks and square brackets also create problems.

[–] [email protected] 3 points 2 days ago (2 children)

I have never heard of this problem for C. Can you elaborate or point to some articles?

[–] [email protected] 15 points 2 days ago (1 children)

The basic problem is that identifiers can be either types or variables, and without a keyword letting you know what kind of statement you're dealing with, there's no way of knowing without a complete identifier table. For example, what does this mean:

foo * bar;

If foo is a type, that is a pointer declaration. But if it's a variable, that's a multiplication expression. Here's another simple one:

foo(bar);

Depending on how foo is defined, that could be a function call or a declaration of a variable bar of type foo, with some meaningless parentheses thrown in.

When you mix things together it gets even more crazy. Check this example from this article:

foo(*bar)();

Is bar a pointer to a function returning foo, or is foo a function that takes a bar and returns a function pointer?

let and fn keywords solve a lot of these ambiguity problems because they let the parser know what kind of statement it's looking at, so it can know whether identifiers in certain positions refer to types or variables. That makes parsing easier to write and helps give nicer error messages.

[–] [email protected] 1 points 2 days ago* (last edited 2 days ago)

I feel this is related, and hightlight this even further, look at all the ways to initialize something in C++.

https://www.youtube.com/watch?v=7DTlWPgX6zs

If you are really lazy, have a look at making an int at around 7:20. It's not horrible that alone, but it does show how many meanings each thing has with very little difference, added on top of years of legacy compatability accumulation. Then it further goes into detail about the auto use, and how parantheses, bracket, squiggly bracket all can be used and help with the mess.