Microsoft debuts Bosque – a yet another pointless programming language



  • @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    There's your problem.

    Yes, I know — see my post two above yours.

    On the other hand, I am pretty certain that you wouldn't. Reasons?

    Most of those reasons are ones coming from you being used to what a DSLR camera can do, and not being used to cameras that don’t have those possibilities.

    1. You can't change ISO sensitivity on the fly to match the lighting conditions.

    Not really relevant for my kind of photography:

    https://www.kamera-express.nl/media/c7675e7c-327c-4f10-9d62-761654c74b4f

    1. To be able to select proper exposure for film you need to either have a light meter, or a huge number of taken shots in your life in order to be able to eyeball it.

    My father’s old camera did have a light meter on top of the viewfinder, but learning to use it was trivial. I don’t think 15-year-old me ever took a seriously over- or underexposed photo with it, and you don’t take a huge number of photos if film and developing cost serious money.

    1. You don't have OIS on film camera and using slow shutter is challenging if your hand is not steady.
    1. You can't save out of focus photo by sharpening and resizing

    True, and this is hard to do with a scan of a real photo. But that has nothing to do with operating the camera.

    1. With DSLR you can press the shutter and get a burst of 6 shots per second

    Not an issue for model photography.

    1. With DSLR you can actually have a pretty good preview of what the final picture will look like

    So does the viewfinder of a film camera, because what do you know? It’s the exact same technology as in a DSLR! Sure, with a DSLR you can see the photo on the screen at the back.

    There is this saying "make something easy to use and only fools will use it" you know.

    That, frankly, is bullshit. Do you use a CLI as your main way to operate your computer, or a GUI?

    Technology is there to make our lives easier. A lot of technology, though, fails at that for any number of reasons.

    Object or not, your reasons seem similar -- lack of patience.

    There’s a difference between patience with something you’re actually interested in, and patience with something that’s only sideways related to what you’re interested in but that you have to give your attention to anyway.



  • @Gurth There are some passing good for macro point-and-shoot cameras, if you know where to look and can stomach the review-browsing and the price. Case in point, here's a photo taken with a Sony DSC-TX30 in bad lighting, no flash, free hand, and a shirt-hem-cleaned lens:
    coin.jpg

    In better lighting and half-proper support, I've taken pics of MicroSD card's surface traces and scratches with it.

    And no, I'm not sure exactly how expensive it was when new, since I bought it from a relative used. But the casing reads "Carl Zeiss", and it's 5-10 years old, so I'm going to guess somewhere around a Smart Fortwo.


  • Banned

    @dkf said in Microsoft debuts Bosque – a yet another pointless programming language:

    @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    We have three words in Poland: Rada Języka Polskiego. But for quite some time, their position has been "we accept everything that's commonly used as proper Polish".

    IIRC, Polish was constructed in its modern form in the 19th century, based on existing languages used in the area and a whole bunch of theory of how languages worked. This isn't something I know for sure, but was according to a friend who was a student of languages (and a philosopher, and a — very good — system admin for the day job).

    Polish language dates back to at least 13th century, and was fully formed by early 1500s, when it started being used in official documents next to Latin. There was this famous 16th century Polish poet (famous in Poland), Jan Kochanowski. He wrote hundreds of poems, and even today, almost all his works can be read by an average 4th graded without much trouble. Some obsolete words, some weird inflection, some words have odd spelling, but overall it's the same language we use today. It's much easier than Shakespeare is for English high schoolers.


  • Resident Tankie ☭

    @Gurth by the way (negative) film has much wider latitude than a digital sensor (at least up to a few years ago). You can often shoot photos one or two stops above (usually better to overexpose film) with few consequences (some film stock has more latitude, and some has less of course). Exposure isn't as much a problem on a film camera as it can/could be on a digital camera. And that said, these days you can overexpose or, better, underexpose a digital camera too with few consequences too.



  • @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    To be able to select proper exposure for film you need to either have a light meter, or a huge number of taken shots in your life in order to be able to eyeball it.

    Has any SLR, digital or film, made in the last 50+ years not had one built in? I got a SLR when I was about 13 or 14 years old (it was nominally my parents' camera for a few years, but it was bought for me to use), alas now both broken (lubricants turned into adhesives during years of disuse) and stolen. That was not 50 years ago, but it's a lot closer than I like to think about — closer to 50 than 40. Automatic exposure was an almost brand-new feature at the time, but having a built-in light meter was not. A common topic of discussion in photography magazines of the day was of the choice between averaging the brightness of the entire scene, or measuring only a small spot in the center of the image, or an average with the center weighted more heavily.

    So, lack of a light meter isn't really an issue under almost any reasonable circumstances.



  • @Gurth said in Microsoft debuts Bosque – a yet another pointless programming language:

    That, frankly, is bullshit. Do you use a CLI as your main way to operate your computer, or a GUI?

    Yes. I use a GUI as the main way to interact with Windows, although I occasionally use bash or PS CLI. I use CLI as the main way to interact with Linux, where I do most of my "real" work, using the GUI mostly to switch between multiple terminal and editor windows.


  • Resident Tankie ☭

    @HardwareGeek AFAIK (one of) the first non-professional reflex camera to have a built in light meter (and automatic metering) was the Canon AE-1. Which I have by the way. Well, it was my dad's. Its shutter wasn't built to stand the test of time, and the camera is now unusable. There were film cameras with light meters but usually one went around with am external light meter, or just knew what kind of exposure the scene required. (The wide latitude helps, once again).



  • @admiral_p said in Microsoft debuts Bosque – a yet another pointless programming language:

    @HardwareGeek AFAIK (one of) the first non-professional reflex camera to have a built in light meter (and automatic metering) was the Canon AE-1. Which I have by the way. Well, it was my dad's. Its shutter wasn't built to stand the test of time, and the camera is now unusable. There were film cameras with light meters but usually one went around with am external light meter, or just knew what kind of exposure the scene required. (The wide latitude helps, once again).

    It's notable for being the first microprocessor-controlled automatic exposure camera.

    From Wikipedia:

    The [Konica] Autoreflex T was the first focal plane shutter 35mm SLRs [sic] with auto-exposure and TTL metering combined in one body.

    That's what I had, bought at the time they introduced the T3, which, according to an external link from Wikipedia, would have been 1973. The Canon AE-1 was introduced in 1976. < /:pendant: >



  • @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    That said, if you are shooting under controlled conditions as you described (tripod, good light, etc), then I have even harder time understanding your issue with a DSLR.

    How many times do I have to repeat that the multitude of buttons and their multiple functions all rolled into one is what keeps confusing me? “I want to adjust the depth of field … let’s see, the display says ‘A’ so that’s right, then I need to turn this wheel … no, it was the other wheel … What did I just change that I didn’t want to?”

    Are you aware that most DSLRs can be remotely controlled from a PC?

    No, and if I was, I don’t have a computer near where I take photos.

    Why not pay someone to do it for you then?

    Hah! Yes, right, transport fairly fragile things to someone else, then pay them a lot of money to do things I can do myself as well, and hope they don’t break anything?

    That's what I do when I can't stomach doing something.

    There’s never any middle ground with you, is there? I never said I can’t stand DSLR cameras, I keep saying I struggle with them. If I hated the bloody things’ guts I wouldn’t have anything to do with them, period.


  • Banned

    @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    I assume you mean that the code should handle taking off outermost layers before taking off inner layers. Which is not exactly hard, but it heavily depends on specifics of available API.

    Not only that, it implements clothing slots -- i.e. you can't wear pants on your head so you need to make sure of that too in your C# code (meaning you need to classify clothes into categories and check which is allowed to be worn where, meaning it's getting more complicated fast).

    This is the easy part. The hard part is connecting user input with the action of taking off pants and all its preconditions.

    It's a very bad API you're proposing...

    It was just a simple explanation of what is needed, not a standard draft.

    It's bad not in the sense it's highly unpolished. It's bad in the sense the very idea is wrong and would lead to much suffering and there is nothing that can be done to fix it than scrap the whole thing and start from scratch.

    ... because Inform 7 operates on objects and actions and relations, not on wearables - the OOP API should be objects and actions and relations, not wearables).

    So an instance of a Wearable class is not an object which has "wearable" attribute? Interesting view of OOP you have there.

    I'm not saying it's not. I'm saying it'd be PITA to work with. For something like Inform 7, you need attributes as "first class citizens" - take value, save it in variable, add to object, remove from object, look up object by attribute, create new attributes, create objects without attributes and make it interactable to some degree. With the API you proposed - where every object is an instance of some static class with fixed behavior - most of these are very hard bordering on impossible. What you should have instead is an Object class that can represent arbitrary thing that has attributes collection inside that determines actual type and behavior, and that can be freely modified at runtime.

    So now you're an authority in what makes [MOVIES BAD]. How long have you practiced [MOVIEMAKING]? Because, you know, if you don't have direct experience in [MOVIEMAKING], your opinion isn't worth shit.

    FTFY... talk about hypocrisy...

    You wouldn't notice sarcasm even if it kicked you in the balls.

    Bro, we're on internet forum. Don't expect me to behave as if I'm defending master's thesis.

    Not any random internet forum with a bunch of Joe SixPacks having their IQ measured with a thermometer, this is TDWTF so I expect better. Doesn't have to be "master thesis" level, but it shouldn't be "I am pulling assertions out of my ass" level either.

    Your complaint wasn't that I'm pulling assertions out of my ass. It was that I'm insufficiently precise. Stop moving the goalposts constantly.

    Whether escaping with "called" is required or not - the end result is, Inform 7 totally ignored that word and didn't treat it like a direction at all.

    The "escaping" is necessary to ignore the word. I wanted Inform 7 to ignore it for the purpose of my demonstration.

    Exactly. That's what escaping is for. The end result is, you name a direction but it's not interpreted as direction.

    I think you've yet again misunderstood what I'm saying. I meant just replacing the word "west" in "west of London" with "north", such that there is a region called "north of London" that's west of Big Ben.

    Nope, you are misunderstanding -- it's because I told it to ignore the word by using "region called" syntax. If you wrote it as "North of London is a region." (standard syntax and how everyone would try to write it the first time they use Inform 7) it wouldn't compile.

    Even more evidence that Inform 7 is based on a bunch of simple grammar rules stitched together with keywords.

    By looking at the grammatical structure of the sentence? Oh wait, it can't do that, because it operates on keywords like every other programming language.

    Are you saying Inform 7 is not analyzing grammatical structure of the sentence at all? As in, it's entirely keyword based?

    Depends on what you mean by that. It has freeform identifiers and numbers and such, but it definitely has a good dose of keywords that are essential for the compiler to understand the code. Same as C++, Python and other "normal" languages. Are they entirely keyword based? Then so is Inform 7. It does analyze grammatical structure of a sentence only insofar as to see whether it matches the grammar rules of the language - there's a bunch of characters, and here's the keyword, it's followed by these clauses that I recognize thanks to keywords, I don't know what's between the keywords but my grammar rules say whatever it is, it must be proper names of things being described, so I'll just copy them all over verbatim. Just like every other language. It is entirely incapable of analyzing grammar at the level that humans are doing - find the predicate, find the subject, figure out how the rest of the words relate to predicate and subject. Inform does nothing like that. It's not a natural language. It's just an imitation - a regular programming language with LALR or LL(k) or some other formal grammar that only disguises itself as English language, and it does it fairly well thanks to how easy English grammar is (compared to other natural languages).

    Now I'm totally confused. What is this guy doing? Is he playing his own composition? Is he playing someone else's composition? Is he playing his own variation of someone else's compisition? If it's someone else's composition, has he ever heard it, or have only seen notes? Because each of these possibilities warrants a different answer.

    And that's why you were supposed to listen to (at least a part of) it when I linked it, because then you would have been able to answer at least some of those questions you only now realize you have.

    I'm pretty sure just listening wouldn't help me at all to determine where the composition comes from. Unless the guy himself says it on the video, but that's very unlikely.

    :wtf: where did a flute come from? I thought we're still talking about this John Gomm guy.

    What I am saying is that by you (hypothetically) observing someone playing flute in the past you can't infer what this guy is doing. Should have been obvious, no?

    No, it wasn't obvious, and it's even less obvious now that you said it. I'd like to unsubscribe from this part of the conversation, it's just too much wharrgarbl for me.

    Okay, I used a bad word. Not an opinion. Should've said I stated a hypothesis. Is stating hypotheses authoritative?

    Try a word "fact". As in, you stated something as if it was a fact when it was just your opinion. Stating facts to me sounds authoritative.

    Well, stating facts wasn't my intention. I'm sorry I made you think I said something I didn't say.

    Which one?

    I can't remember anymore -- I am trying to cut the post length by removing old quotes which makes the posts more manageable but also harder to look back and infer context.

    Let's say its not important

    Oh, fuck you man. First you get extremely obtuse and refuse to say what you mean and demand I read your mind instead, and now you're like "oh it doesn't really matter, I spoke some bullshit but it was so long ago, let's forget it and carry on". Fuck you. (Not for wanting to move on because it was stupid. For being so obtuse and annoying in the first place.)

    what is important is that you checked out Inform 7 and maybe got a bit curious about it.

    Nah, not really. In fact, I'm less interested in it now than I was when you first mentioned it. At first, I suspected it wouldn't be very useful for "real" programming. Now, thanks to @zekka, I know for sure it definitely isn't.


  • Banned

    @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    This is the easy part. The hard part is connecting user input with the action of taking off pants and all its preconditions.

    Respectfully disagree.

    Obviously you never tried to make command processor for an extremely extensible system. (I did. I quickly abandoned the project because it was simply too much work for me at the time.)

    What you should have instead is an Object class that can represent arbitrary thing that has attributes collection inside that determines actual type and behavior, and that can be freely modified at runtime.

    And you say Wearable class could not be derived from such Object class? Because that is what I had in mind, not single static classes.

    Deriving doesn't fix anything. You're still constrained by objects having to belong to a particular class and not being able to change object's class later, and not being able to compose behaviors of several different, potentially overlapping classes, and conditionally enabling/disabling behaviors of particular classes for a given object based on other things happening. Or maybe you could do that, but it would be 1000x more work than with Inform 7. And not because of its syntax, but because of a far superior (for this particular use case) object model. An object model that can be completely replicated in any OOP language - but not with your design.

    You wouldn't notice sarcasm even if it kicked you in the balls.

    That's because Mr. Sarcasm would break his foot if he did that.

    Nice self-diss.

    Even more evidence that Inform 7 is based on a bunch of simple grammar rules stitched together with keywords.

    So first it was just keywords, now it is bunch of simple grammar rules and keywords? Can't you decide already?

    I thought it was obvious that "keywords" is shorthand for "grammar rules that use keywords for reference points". I mean, what else have you imagined? But either way, it still counters your claim that there are no keywords at all. They're not just there - there's plenty of them, and they're essential for Inform 7 to understand even most basic statements.

    Depends on what you mean by that...

    I mean that in Inform 7 there is this thing called a rulebook -- i.e. there is a way to change rules for parsing.

    Nah, I'm pretty sure Inform 7 can't redefine its own grammar. Sure, it can change the semantics of particular identifiers (a language that can't do that would be pretty useless), but parsing rules themselves? You're going too far. It doesn't even have macro system, from what I can tell.

    Quick question - how much do you know about parsers and parsing? From computer science side of things?

    I'm pretty sure just listening wouldn't help me at all to determine where the composition comes from. Unless the guy himself says it on the video, but that's very unlikely.

    It's literally in the title of video? Ain't nobody by Chaka Khan? Never heard of it I guess?

    See? All I need is read, not listen.

    Oh, fuck you man

    Likewise. And if you still want to know which one, it's the problem you presented with center of galaxy.

    I still don't know what you mean but whatever. Forget it.

    Nah, not really. In fact, I'm less interested in it now than I was when you first mentioned it. At first, I suspected it wouldn't be very useful for "real" programming. Now, thanks to @zekka, I know for sure it definitely isn't.

    That's his fault, not mine. I got you to be curious by making you think, he came in to shit over my "defense" and ruined everything.

    By mentioning a single most important characteristic of Inform 7 that's a complete deal breaker for almost any application - that it can't create objects dynamically. You're so obsessed with selling Inform 7 as a general purpose programming language that you haven't even noticed that @zekka was on your side, showing off all its good qualities and making a point that despite its shortcomings, it's still an amazing language.

    For the record, I share thst sentiment. I think Inform 7 is an amazing language - it's just pretty much useless outside its narrow niche of text adventure games.


  • Resident Tankie ☭

    @Gąska Just as a curiosity, what would an amazing language like Inform 7 that would also be suited to general programming look like?


  • Banned

    @admiral_p it would allow creating objects dynamically.


  • Discourse touched me in a no-no place

    @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    it would allow creating objects dynamically

    It sounds like it would also allow a class to be altered dynamically (there's quite a few languages which permit that, sometimes only with nasty syntax) and an object's class dynamically (a rather rarer characteristic). If you don't insist on the syntax scheme of Inform 7, there's still multiple languages you might consider; programmers seem to like having symbols in their language for what they think are basic operations (a legacy of maths).

    Are there any languages that don't let you make object instances dynamically (assuming they have objects at all)? That's a very deep restriction. I guess some of the languages (or language profiles) used for avionics and other safety-critical applications might be like this…



  • @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    Obviously you never tried to make command processor for an extremely extensible system. (I did. I quickly abandoned the project because it was simply too much work for me at the time.)

    That's like creating your own interpreter..
    I once had the idea to create an interpreter for PHP-scripts, to enumerate a (dependency)tree for documentation-purposes. It only needed a limited amount of syntax-parsing (include, require, object-construction calls and namespaces). But due to the "endless" variants of syntax-markup I deemed the task too big to pursue.

    I thought it was obvious that "keywords" is shorthand for "grammar rules that use keywords for reference points".

    Ofcourse that's obvious. Keywords define which type of grammar rules has to be used. IFs, FORs, SWITCHes, etc all have their specific grammar.

    @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    Again, what I posted wasn't a design -- I was trying to explain to you (a moron), what I wanted you to replicate (not really implement, just to eyeball how much effort would it be) in a language other than Inform 7. Maybe I failed because I am bad at explaining, maybe I failed because you have proven yourself to be a dickless asshat moron time and time again. It doesn't matter -- what matters is that you first said it's the same number of lines like Inform and now you are saying how it is complicated. In other words you are full of bovine excrement as usual.

    What you (Levicki) says is "How many code do you need for writing this wearable-behaviour INCLUDING the code to be able to implement players and wearables (which Inform7 does for me, so I need to write less code, so Inform7 is better)"

    I think Gqaska talked about 2 subjects:

    • If I had a library that can already do everything that Inform 7 runtime can do, such as parse user input, analyze preconditions and execute commands on appropriate targets based on predefined rules - then it would be roughly 35 lines to write the clothing system.
    • Inform 7 operates on objects and actions and relations, not on wearables

    I think the counter-argument of Gqaska would/should be like:
    I can create a 3D game in Unity with less then 35 lines of code. How many lines of code you need to write a 3D game in Inform7, without a library which implements a 3D game-engine in Inform7?

    And

    Inform7 is unable to implement about 100% of the design patterns, because objects are immutable (static), and as such it's not even suited for making a text-based adventure like Leisure Suit Larry.

    Most embedded programs written in C do not create objects dynamically as a matter of choice yet they still work and represent some of the safest computer systems ever built.

    What you (Levicki) actually say: "C (a functional imperative programming language) isn't object-orientated, so it has to be a static language, just like Inform7"


  • Discourse touched me in a no-no place

    @Flips said in Microsoft debuts Bosque – a yet another pointless programming language:

    "C (a functional programming language) isn't object-orientated, so it has to be a static language, just like Inform7"

    Shall we count the errors in that statement?



  • @dkf
    enlighten me :)


  • Discourse touched me in a no-no place

    @Flips Well, the first one is that C isn't a functional programming language…



  • @dkf said in Microsoft debuts Bosque – a yet another pointless programming language:

    @Flips Well, the first one is that C isn't a functional programming language…

    I already looked it up and indeed, it isn't.

    C is a general-purpose, imperative computer programming language

    I called every language without OOP, a functional programming language. But it is indeed very different. Thanks, and I will fix my previous post.



  • @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    Dude there are literally 2 wheels on the right side of most DSLRs -- one for shutter speed and one for the aperture control. How hard is to remember that?!?

    To hell with this. You seem to be totally incapable or unwilling to understand that someone else’s experiences and capabilities may not match your own.

    If the mode rotary switch is set to A then that's full auto mode and you can't change shit (or at least nothing important).

    I said A only because I thought I remembered it says A for aperture, but chances are very good that it’s actually some other letter.

    No, just invite photographer to do it in your place. I am sure they would be fine with such assignment.

    Sure, for €65 to €150 per hour. Thanks, but I’ll borrow a camera and fight with it instead.


  • Banned

    @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    Obviously you never tried to make command processor...

    I have better things to do in my life, thank you.

    And yet you wanted me to try out programming in Inform 7...

    [blablabla] An object model that can be completely replicated in any OOP language - but not with your design.

    Again, what I posted wasn't a design -- I was trying to explain to you (a moron), what I wanted you to replicate (not really implement, just to eyeball how much effort would it be) in a language other than Inform 7. Maybe I failed because I am bad at explaining, maybe I failed because you have proven yourself to be a dickless asshat moron time and time again.

    Or maybe you failed because what you described wasn't replicating anything that Inform 7 has. Have you thought of that possibility?

    It doesn't matter -- what matters is that you first said it's the same number of lines like Inform and now you are saying how it is complicated. In other words you are full of bovine excrement as usual.

    Try to reimplement Inform 7 in Inform 7. See how many lines that is. Because you're asking me to first reimplement almost entirety of Inform 7 in a language of choice, and then reimplement the clothing system on top of that Inform 7 reimplementation, and add those two line counts together - and compare it to your Inform 7 code that only takes care of the latter. That's by no means fair comparison.

    Nice self-diss.

    Nice lack of comprehension there, Mr. NoBalls.

    Says the person who doesn't feel pain from crotch kick.

    Nah, I'm pretty sure Inform 7 can't redefine its own grammar. Sure, it can change the semantics of particular identifiers (a language that can't do that would be pretty useless), but parsing rules themselves? You're going too far. It doesn't even have macro system, from what I can tell.

    And how would extensions be implemented then?

    [ SPACEPause i;
    	while (i ~= 13 or 31 or 32)
    	{
    		i = VM_KeyChar();	
    	}
    ]; 
    
    To wait for the/-- SPACE key:
    	(- SPACEPause(); -).
    
    Pausing the game is an activity.
    
    To pause the/-- game:
    	carry out the pausing the game activity.
    
    For pausing the game (this is the standard pausing the game rule):
    	say "[paragraph break]Please press SPACE to continue." (A);
    	wait for the SPACE key;
    	clear the screen. 
    

    I don't know exactly what's going on here (as usual, you're both unable and unwilling to explain your examples), but it looks like [ ]; allows embedding some other language inside Inform 7 (base bytecode language? Another high-level langauge that compiles to the same virtual machine? Who knows), and this embedded language is also very regular, with fixed syntax rules and all. And the invocation looks like another embedding, except delimited with (- -) instead of [ ];. So no, still no new grammar rules. Just embedding another language.

    Also:

    Understand the commands "open" and "uncover" and "unwrap" as something new.
    Understand "open [something]" or "uncover [something]" or "unwrap [something]"
    as opening. Understand "open [something] with [something]" as unlocking it
    with. Understand "open [a locked lockable thing] with [something]" as
    unlocking it with. Understand "open [a lockable thing] with [something]" as
    unlocking it with.
    
    Check unlocking it with (this is the must be able to reach the key rule):
    	abide by the must have accessible the second noun rule.
    
    The right second rule is listed instead of the can't unlock without the
    correct key rule in the check unlocking it with rulebook.
    
    This is the right second rule:
    	if the second noun does not unlock the noun:
    		say "[The second noun] [do not fit] [the noun]." (A) instead. 
    

    This doesn't define new grammar rules either. It just defines new commands, the same way you define functions in C#. It's the same grammar: "[command] [object]", optionally followed by "with [another object]".

    It really sounds like you have no idea what grammar is (in computer science).

    See? All I need is read, not listen.

    If you can hear music by reading titles on youtube then I guess that's good for you idiot. What can I say, you beat me?

    I give up. I just don't have any more patience. I don't care anymore that you said "it's literally in the title of video" and then derided me for pointing out that title of video is text, not music. Your idiocy is just too much for me to bear with. I'm done.

    ...on the topic of music. I will fight your idiocy about programming languages till the end of time.

    By mentioning a single most important characteristic of Inform 7 that's a complete deal breaker for almost any application - that it can't create objects dynamically.

    Most embedded programs written in C do not create objects dynamically as a matter of choice yet they still work and represent some of the safest computer systems ever built.

    That's why I said "almost". Because there are types of programs that don't need dynamic objects either. But Inform 7 is completely inapplicable for low-level embedded programming for other reasons (not being able to target microcontrollers is just the beginning).


  • Banned

    @Flips said in Microsoft debuts Bosque – a yet another pointless programming language:

    Inform7 is unable to implement about 100% of the design patterns, because objects are immutable (static), and as such it's not even suited for making a text-based adventure like Leisure Suit Larry.

    That's not true. Object creation is static - that is, you cannot create more objects than you started with - but objects themselves can be freely modified.



  • @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    I don't know exactly what's going on here (as usual, you're both unable and unwilling to explain your examples), but it looks like [ ]; allows embedding some other language inside Inform 7 (base bytecode language?

    I can explain a little: Inform 7 is the English-looking version of the language, while Inform 6 (and earlier) is a more traditional(?) looking language.

    Inform 7 code can include Inform 6 code, which is what you're seeing in that post. Inform 7's toolset doesn't actually compile directly to the virtual machine; it first creates Inform 6 code and uses the Inform 6 toolset to compile the result to the virtual machine.

    You might also find the Inform 7 "Standard Rules" interesting; it's the standard library, included in all programs by default, that defines things like directions, containers, clothing, and so on.


  • Banned

    @Parody said in Microsoft debuts Bosque – a yet another pointless programming language:

    @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    I don't know exactly what's going on here (as usual, you're both unable and unwilling to explain your examples), but it looks like [ ]; allows embedding some other language inside Inform 7 (base bytecode language?

    I can explain a little: Inform 7 is the English-looking version of the language, while Inform 6 (and earlier) is a more traditional(?) looking language.

    Inform 7 code can include Inform 6 code, which is what you're seeing in that post. Inform 7's toolset doesn't actually compile directly to the virtual machine; it first creates Inform 6 code and uses the Inform 6 toolset to compile the result to the virtual machine.

    Yeah, I suspected something like that, though not that it's a previous language version. Also, it makes me wonder how much you can actually do in Inform 7 without using embedded Inform 6 snippets - because if Inform 6 snippets are required, it means Inform 7 cannot do something on its own. Of course you can sidestep the issue by declaring Inform 6 is an integral part of Inform 7 and asking about "pure" Inform 7 makes no sense, which is an obvious deflection and not actual answer, but sure, I'll accept it.


  • Resident Tankie ☭

    @Gąska maybe it's just code reuse.


  • Banned

    @admiral_p maybe it's just code reuse. But something tells me it isn't.


  • Resident Tankie ☭

    Don't you all think that the debate has become frankly a bit stale? I mean, come on lads.



  • @admiral_p said in Microsoft debuts Bosque – a yet another pointless programming language:

    Don't you all think that the debate has become frankly a bit stale? I mean, come on lads.

    I can't believe I'm upvoting you, but you're totally right here. It was stale a long time ago--y'all have been treading the same ground, beating the same dead horse now for a while.


  • Banned

    @admiral_p said in Microsoft debuts Bosque – a yet another pointless programming language:

    Don't you all think that the debate has become frankly a bit stale? I mean, come on lads.

    It's not even half as bad as the one we two had about socialism.

    I promise I drop this conversation as soon as @levicki reads up on formal grammar basics.


  • Banned

    @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    Or maybe you failed because what you described wasn't replicating anything that Inform 7 has.

    I gave a very specific set of commands you need to implement (wear, remove) and asked how complicated it would be in another language.

    It would be much more complicated than in Inform 7 because the specific design of the API you provided made it much more complicated compared to what can be done in Inform 7. If instead of just one specific class, Wearable, and just two methods to override on it, you just let me add arbitrary commands and associate these commands with arbitrary attributes and associate these attributes with arbitrary objects, like you can in Inform 7, it would take roughly 35 lines - just like in Inform 7. But not with the API you've given. Maybe you don't see why the API you've given is wrong, but if you only read my previous posts (or even this post right here), you'd know.

    Because you're asking me to first reimplement almost entirety of Inform 7 in a language of choice, and then reimplement the clothing system on top of that Inform 7 reimplementation, and add those two line counts together - and compare it to your Inform 7 code that only takes care of the latter. That's by no means fair comparison.

    No, that's not what I am asking. How you connect user input to commands is irrelevant. How you present the results to the player is irrelevant.

    Yes, that much is irrelevant.

    How you design Object and Wearable class is irrelevant.

    But here you're completely wrong. That they were a class made it much harder, and it would make somewhere between 5 and 50 times more code than Inform 7 - mostly because I would have to replicate most of the Inform 7's machinery for handling attributes and command preconditions.

    What is relevant is how many lines of code it take to implement wear and remove commands for wearables in a way that checks a) that thing is worn in a proper slot, b) that it is put on and removed in a proper order.

    The big problem is that with your API - assuming the starting point is the same as in Inform 7 code, i.e. there is no such thing as order and it has to be done from scratch - is that it would require bizarre amount of code to inject the entire relationship of underworn or whatever it's called in just the overloads of two methods, probably breaking every single coding practice in existence in the process. But with different API it would be non-issue.

    I don't know exactly what's going on here (as usual, you're both unable and unwilling to explain your examples)

    If you want to know, go to Inform 7 folder Internal and look at Extensions folder. Finally, also take a look at Languages folder (there is only English there by default, but you can see German source here), you will notice that languages redefine the way text is treated.

    You'd have to point me to a specific fragment. The file is huge, it's mostly in German (at least it's online), and my overall infamiliarity with Inform 7 - and even more with Inform 6, which seems to be used for all the important bits - makes me unable to understand it at all. But it sure looks interesting. Is Inform 7 some kind of addon for Inform 6, written in Inform 6?

    but it looks like [ ]; allows embedding some other language inside Inform 7

    But how when you said Inform 7 doesn't even have macros?

    Foreign language embeds aren't macros. Macros are metaprogramming tools. The output of macros is source code. C macros produce C code. These [ ]; things don't produce Inform 7 code. It's just embedding another language and passing it to compiler backed through a completely different channel than the rest of source code goes. Like asm blocks in C. asm blocks aren't macros.

    This doesn't define new grammar rules either. It just defines new commands, the same way you define functions in C#. It's the same grammar: "[command] [object]", optionally followed by "with [another object]".

    It overrides the built-in logic, you could say it's a virtual function or something but it does change a way player's text is treated so yes it changes parsing.

    Virtual functions have nothing to do with it at all, but yes, it does look like Inform 7 allows to alter grammar significantly. Although mostly through Inform 6 embedded snippets.

    That's why I said "almost". Because there are types of programs that don't need dynamic objects either. But Inform 7 is completely inapplicable for low-level embedded programming for other reasons (not being able to target microcontrollers is just the beginning).

    VM can surely be ported to those, the problem would be small amount of RAM such systems have.

    Exactly. Small RAM makes Inform 7 impossible on most embedded devices. As well as highly non-deterministic execution times, which cannot be solved just by adding more RAM. And outside of embedded, Inform 7 is impractical in almost every case because it cannot create objects dynamically. Note that I'm not saying it as a criticism. They made a conscious design choice here. The choice has some consequences. For the target audience of Inform 7, this choice is better than the alternative. It was a good choice. But this, and some other things, made Inform 7 impossible (or nearly impossible) to use for anything else than text adventures.



  • @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    @Flips said in Microsoft debuts Bosque – a yet another pointless programming language:

    Inform7 is unable to implement about 100% of the design patterns, because objects are immutable (static), and as such it's not even suited for making a text-based adventure like Leisure Suit Larry.

    That's not true. Object creation is static - that is, you cannot create more objects than you started with - but objects themselves can be freely modified.

    Hm sorry I misunderstood (partially). I knew you ment about object creation (so we would not be able to implement the Factory design-patterns, or create other objects "on the fly" for that matter).

    Think it's my lack of knowledge.. But I'm still wondering on what you ment by

    I'm saying it'd be PITA to work with. For something like Inform 7, you need attributes as "first class citizens" - take value, save it in variable, add to object, remove from object, look up object by attribute, create new attributes, create objects without attributes and make it interactable to some degree. With the API you proposed - where every object is an instance of some static class with fixed behavior - most of these are very hard bordering on impossible

    Still I think my conclusion "Inform7 is unable to implement about 100% of the design patterns" is a correct one, and as such Inform7 seems a worthless language to me. Would be kind of you guys (including @levicki ) if you still can react on this statement.
    _

    @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    @Flips said in Microsoft debuts Bosque – a yet another pointless programming language:

    What you (Levicki) says is "How many code do you need for writing this wearable-behaviour INCLUDING the code to be able to implement players and wearables (which Inform7 does for me, so I need to write less code, so Inform7 is better)"

    No, I explicitly said EXCLUDING that code, hence the simple example of Wearable class on which he got stuck up.

    Excluding that code, makes the assumption these structures (Inform7 implements) are already in place, which results in (again) about the same lines of code as Inform7 needs...
    Then it becomes a ridiculous question, equal to "How many particles you need to create the same universe we life in, assuming you already have such a universe"

    What you (Levicki) actually say: "C (a functional imperative programming language) isn't object-orientated, so it has to be a static language, just like Inform7"

    No, that's absolutely not what I said. You are a fucking moron.

    1. I never said anything about C language itself in that quote.

    You made the verbose comparison, whether you like it or not.

    1. I said programmers are making a conscious choice to write certain kind of software (i.e. embedded stuff in C) without using dynamic objects.

    Not needing to create objects on the fly, is different then not being able to create objects on the fly.

    1. I also said that it has served them (and us) extremely well.

    ofcourse it serves extremely well, if you only make software which would never create objects on the fly.

    Actually, every piece of software can be rewritten so they would never create objects dynamically. That's like forcing to load a complete blu-ray movie into memory, before you can play it.


  • BINNED

    @admiral_p
    What are you talking about? We have this ivory tower dude that thinks someone is knocking on his door will in reality there is a relentless battering ram braking it apart, grond style but maybe a bit more polished.
    Highly entertaining.


  • Banned

    @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    But here you're completely wrong.

    As I said, I meant to explain that I wanted a mock so I still think you are taking my example too literally.

    But with different API it would be non-issue.

    Can you show a brief example of such API which would work much better?

    Quick and dirty example that's only a beginning and isn't really functional because I don't have time:

    class Environment
    {
        public Dictionary<string, ObjectId> objectNames;
        public Dictionary<string, AttributeId> attributeNames;
        public Dictionary<string, PropertyId> propertyNames;
        public Dictionary<string, CommandId> commandNames;
        public Dictionary<CommandId, Action<List<ObjectId>>> commandExecutors;
        public Dictionary<CommandId, List<Func<List<ObjectId>, bool>>> commandPreconditions;
        public Dictionary<ObjectId, Set<AttributeId>> objectAttributes;
        public Dictionary<ObjectId, Dictionary<PropertyId, ValueType>> objectProperties;
        public List<RelationId, (ObjectId, ObjectId)> objectRelations;
        public Dictionary<RelationId, RelationId> oppositeRelations;
        public event Action<ObjectId, AttributeId> attributeAdded;
        public event Action<ObjectId, AttributeId> attributeRemoved;
        public event Action<ObjectId, AttributeId, ValueType> propertyAdded;
        public event Action<ObjectId, AttributeId, ValueType, ValueType> propertyChanged;
        public event Action<ObjectId, AttributeId, ValueType> propertyRemoved;
        public Dictionary<CommandId, List<(Func<List<ObjectId>, bool>, Action<List<ObjectId>>)>> commandOverrides; // first function in tuple checks whether override applies (and returns true/false - first true is used), second contains the override code
    }
    

    All these should probably be private and only expose access methods. But with API roughly like this, adding over/under relationship between clothes and making overrides for wearing/removing should be no-brainer.

    You'd have to point me to a specific fragment.

    The idea was to compare to English file which you already have if you installed Inform, don't tell me you don't have some sort of visual diff tool?

    The thing is, English file is very simplistic and doesn't really contain anything interesting - only a bunch of pluralization rules and zillion aliases for "me" and "you". German, on the other hand, disables almost entirety of standard library, and then has a few dozen Inform 6 snippets that at first glance look like char-by-char command parsers that presumably replace the standard ones for raisins. And then the code switches entirely to German. It could mean one of several things:

    • Inform 7 doesn't really contain keywords - they can be renamed to anything the user wants and everything still works fine, and there's no need to rely on original spelling altogether. The only core, really unmodifiable part of Inform 7 is Inform 6 embeds. But ultimately, only identifiers are changed - the grammar stays the same: "[a word that's synonym for 'understand'] [new identifier] [a word that's synonym for 'as'] [previously defined object or command]".
    • German language file replaces half of Inform 7 with something entirely different, and it can be anything they want, and no old rules apply anymore. Which is essentially not Inform 7 anymore.
    • There are some extension points deep inside Inform 7 that not only can be used to change entire grammar, but are meant to be used exactly that way. It looks entirely different but it's still all part of the Inform 7 spec. Much less work is needed than if were to decide to rewrite entire command parsing from scratch.

    I hoped you could help me figure out which one it is in this particular case, and how exactly they managed to achieve it.

    For starters, German implements more cases and handles genders differently.

    Why are you even talking about genders? Are you sure you aren't confusing programming language grammar with spoken language grammar? These are two entirely different subjects, and I mean entirely. They're not even remotely similar. Formal grammar isn't even part of linguistics, it's pure mathematics. I was only talking about formal grammar that describes the programming language that is Inform 7.

    Is Inform 7 some kind of addon for Inform 6, written in Inform 6?

    Here is a good overview of Inform architecture (full details here):

    This overview is so high level that it tells essentially nothing (not even answer my direct question - is Inform 7 written in Inform 6?). But I don't blame you for it. It wasn't you who wrote it, after all - and it's probably the best one available anyway. Which is a shame.

    In theory, you could replace the last step and compile Inform 6 code into C# or lua or whatever.

    Yes, yes, Turing completeness and all that. It's really not that insightful that any byte sequence that already exists could be theoretically converted to another byte sequence that possibly doesn't exist yet. Emscripten is almost a decade old.

    Foreign language embeds aren't macros.

    You missed a word (doesn't even have macros). I wasn't claiming those are macros.

    I don't understand what you're getting at. I said it doesn't have macros. You showed me something that isn't macro. I said it's not a macro. You agree with me. So where's the problem?

    but yes, it does look like Inform 7 allows to alter grammar significantly.

    I find that great and inspiring.

    It would be great if it inspired you to finally say something useful for once. Like, how exactly does German translation (your own example that you have yourself linked) manages to redefine all language commands such that the code doesn't have to rely on any English keywords at all.

    Inform 7 is impractical in almost every case because it cannot create objects dynamically.

    Do you think it would be possible to modify the parser (and VM if necessary) to accept "Create room called Restaurant At The End Of The Universe" from player input and indeed create new object dynamically?

    Now I am curious...

    I think it wouldn't play well with the attribute system right off the bat - you'd get objects that are supposed to be some category but aren't because the right rules haven't been triggered or were triggered in a wrong order. My guess is that it would be possible if you had source access to Inform 7 compiler.

    @Flips said in Microsoft debuts Bosque – a yet another pointless programming language:

    Actually, every piece of software can be rewritten so they would never create objects dynamically. That's like forcing to load a complete blu-ray movie into memory, before you can play it.

    Actually, static code would stream Blu-ray movie through reusing fixed size buffers, dynamic code would be constantly allocating and freeing all kinds of buffers and doing endless, pointless copying of data. Guess which one is faster, more predictable, and more reliable?

    A well written "dynamic" code would allocate a buffers only once per playback, and they would have sizes that provide most performance for this particular playback, taking into account video formats, input resolution, output resolution, audio features, disk type etc. A badly written "static" code would constantly stutter, having to wait for decoder to get its work done before loading the very next frame because the buffer is so small.

    Why are you always comparing the best possible implementation of one technology to the worst possible implementation of another technology? Usually that leads to wrong conclusions, and even in those rare cases when the conclusions are right, you come off as insincere and people get very cautious about believing you.


  • BINNED

    @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    I promise I drop this conversation as soon as @levicki reads up on formal grammar basics.

    Can we expect this to happen before the heat death of the universe? 🚎




  • Banned

    @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    The thing is, English file is very simplistic...

    So, what is your conclusion now? Is inform 7 keywords only, or is it keywords + grammar, or is it keywords + extensible (and replaceable) grammar or what?

    I don't know. It all depends on what exactly Inform 7 allows to customize. English language file doesn't contain many customizations. German language file is filled with Inform 6. Hence my follow up questions.

    I hoped you could help me figure out which one it is in this particular case, and how exactly they managed to achieve it.

    Sadly, I know as much as you about that or I would be glad to explain.

    Yeah, too bad. Although you could've said that 300 posts ago and not waste everyone's time.

    Why are you even talking about genders? Are you sure you aren't confusing programming language grammar with spoken language grammar?

    In Inform 7's case you are writing "code" using (almost) the same grammar, are you not?

    The question doesn't make sense because linguistic grammar is about word classification, inflection and sentence structure analysis, while formal grammar is about transforming symbols into terminal symbols that match the source text.

    This overview is so high level that it tells essentially nothing (not even answer my direct question - is Inform 7 written in Inform 6?). But I don't blame you for it. It wasn't you who wrote it, after all - and it's probably the best one available anyway. Which is a shame.

    Yes, Inform 7 is transpiled to Inform 6.

    This is not what I asked. Is Inform 7 COMPILER itself written in Inform 6?

    Maybe wikipedia article has more details you want.

    Sadly, no.

    Also, here is an article by Emily Short (one of the prominent authors and contributors) on differences between Inform 7 and 6.

    Interesting read, but very light on technical details. I think this is my biggest problem with Inform 7 as a whole - it's aimed at non-technical users, and so all documentation is also very non-technical. It tells you everything about how to do things, but nothing about how things actually work. Which is a valid choice and certainly helpful for their target audience - but it's yet another thing that makes it a bad choice for anything more serious than text adventure, even if all the technical limitations were taken care of.

    A well written "dynamic" code would allocate a buffers only once per playback, and they would have sizes that provide most performance for this particular playback, taking into account video formats, input resolution, output resolution, audio features, disk type etc.

    If you are talking about modern players that wouldn't be possible because things can change during playback (yes people concatenate videos of different resolution and expect them to play).

    What wouldn't be possible? Dynamic allocations have strictly greater capabilites than static allocations. In the worst case, you end up with being able to do everything a static allocation model can do. Also, dynamic allocation means you can dynamically reallocate at runtime - you aren't bound to your initial choices.



  • @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    This is not what I asked. Is Inform 7 COMPILER itself written in Inform 6?

    The compiler is written in C.

    http://inform7.com/sources/src/i6template/Woven/Appendix-B.pdf

    Does that surprise anyone though?


  • Banned

    @CodeJunkie finally, some actual technical reading. It's incredibly hard to find on their website. Thanks!



  • @Gąska Here is the actual source code. http://inform7.com/sources/i6n/

    Inform 7 sits on top of Inform 6...all versions before Inform 7 were a C-Like language (which makes sense considering the compiler and everything else is written in C).


  • Banned

    @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    Yeah, too bad. Although you could've said that 300 posts ago and not waste everyone's time.

    But how would you get to argue this much with me then? I was doing you a favor.

    I could just go to garage and argue there as much as here.

    What wouldn't be possible?

    Allocating once per playback wouldn't be possible.

    You would either have to over-allocate (and thus become the same as static allocation code) or allocate on frame size change.

    Que? I've never seen a file format that changed its frame structure in the middle of file.

    In the worst case, you end up with being able to do everything a static allocation model can do.

    But with worse performance because you have heap management and function calls in the middle of critical path.

    Que? What exactly makes it necessary to call expensive functions in critical path?



  • @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    I meant to explain that I wanted a mock

    Ah, simple misunderstanding. We thought you wanted to be mocked. That's what we do here. You want the DepartmentForum of Mocking, down the hall, third door on your left. This is the Forum of Mockery.




  • Considered Harmful

    @Luhmann said in Microsoft debuts Bosque – a yet another pointless programming language:

    @admiral_p
    What are you talking about? We have this ivory tower dude that thinks someone is knocking on his door will in reality there is a relentless battering ram braking it apart, grond style but maybe a bit more polished.
    Highly entertaining.

    Which one's the ivory tower dude? The PHP afficionado?


  • Banned

    @Gribnit I've been wondering that myself. Neither of us seems particularly academic. But @levicki certainly likes pretending he has a high horse.


  • Discourse touched me in a no-no place

    @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    But @levicki certainly likes pretending he has a high horse.

    He should keep that horse off the weed.


  • Banned

    @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    I could just go to garage and argue there as much as here.

    It's not the same, you hate me more.

    You must've never met Rhywden.

    Que? I've never seen a file format that changed its frame structure in the middle of file.

    copy /b a.mpg+b.mpg merged.mpg

    Huh. TIL.

    Que? What exactly makes it necessary to call expensive functions in critical path?

    Heap management is not free in terms of performance, is it?

    It is when you're not using it (at the moment). Code that doesn't run (at the moment) takes no CPU time (at the moment).

    @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    But @levicki certainly likes pretending he has a high horse.

    What I have is long and thick as a 🐎 🍆, and all you mockers can have a 🏇🏻.

    Amazing Horse : animated music video : MrWeebl – 00:55
    — Weebl's Stuff



  • @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    @Flips said in Microsoft debuts Bosque – a yet another pointless programming language:

    Actually, every piece of software can be rewritten so they would never create objects dynamically. That's like forcing to load a complete blu-ray movie into memory, before you can play it.

    Actually, static code would stream Blu-ray movie through reusing fixed size buffers, dynamic code would be constantly allocating and freeing all kinds of buffers and doing endless, pointless copying of data. Guess which one is faster, more predictable, and more reliable?

    @Gąska said in Microsoft debuts Bosque – a yet another pointless programming language:

    Why are you always comparing the best possible implementation of one technology to the worst possible implementation of another technology? Usually that leads to wrong conclusions, and even in those rare cases when the conclusions are right, you come off as insincere and people get very cautious about believing you.

    Yes you guys are right.
    My comparisons suck most of the time. I use them a lot (unfortunately) because I'm not that known with the English language, and the IT nomenclature/jargon.

    ps The discussion about Inform's keywords/grammar in multiple languages.....
    I would suggest to write a "rulebook" or whatcha-ma-call-it which converts Inform back to an imperative programming language. That would be so funny. And would be much easier to comprehend the differences (= shortcomings of Inform) 😆


  • Banned

    @Flips um... my comment wasn't about you.



  • @Gąska
    I felt that quote was applicable to both me and levicki. Maybe I'm silly again for like the third time... But thanks for telling me ☺


  • Java Dev

    @levicki said in Microsoft debuts Bosque – a yet another pointless programming language:

    What I have is long and thick as a 🐎 🍆

    I dunno how impressive a horseradish-sized cock would be tbh, they seem to be of average size when compared...


Log in to reply