In my experience, at least some aspects of the Indian English exists because we Indians often mentally translate what we want to say from our native language (which are plentiful) to English before it comes out of our mouth.
I don't imagine this is a uniquely Indian phenomenon – other non-native English speakers would be doing the same.
Even Irish people whose main language since birth is English do this. There's a verb in Gaeilge which does exist in English but is translated as "does be". Examples:
- He does be eating his breakfast
- She does be out walking the dog
It's the continuous/habitual form of to be, so the implication is that she does be walking the dog everyday, or regularly. He does be eating his breakfast everyday.
The interesting thing is that you'll meet Irish people who were never fluent in Irish - learned it in school, sure, but never spoke it daily - who still use this conjugation when speaking English.
In my native Cantonese (and this probably applies to a lesser extent to Mandarin as well), pronouns are inherently non-gendered, and when we speak in English we tend to randomly pick one (he/she) and thus occasionally get the gender wrong.
That said I think there are "levels" to so called "mental translation" -- I don't think I consciously mentally translate anything at all, but I guess sometimes the neural pathways or whatever are kinda repurposed/re-used even if there are some differences between languages.
> A juggernaut, in current English usage, is a literal or metaphorical force regarded as merciless, destructive, and unstoppable.
> This English usage originates in the mid-nineteenth century. Juggernaut is the early rendering in English of Jagannath, an important deity in the Hindu traditions of eastern and north-eastern India. The meaning originates from the Hindu temple cars, which are chariots, often huge, used in processions or religious parades for Jagannath and other deities, the largest of which, once set into motion, are difficult to stop, steer or control by humans, on account of their massive weight.
I have wondered if there are people in India who fit a description of certain europeans, in that they are said to speak 9 languages, none of them fluently.
My father came from India originaly, but is of the type who is concerned with correctness in all things, but speaks fondly of the fun and games of multi lingual word play, and harder to master languages such as punjabi, and classical persian.
I think that India is so multi lingual and large to begin with that there will be regional differences in the use of other languages...portugese, spanish, english, and many others and the concept of "indian english" is realy an intro into a much much vaster world of crosscultural exchange and cominication ongoing for millenia.
edit: spelling, always spelling
Almost every Indian I know (including me) mixes at least two languages in their daily conversations seamlessly, that too within a sentence. Westerners may find that Indians talking among themselves in their native language(s) drop English words out of nowhere. Again, I can't imagine this to be a uniquely Indian phenomenon. Multilingual people would be doing this.
Lingual purists may find it irritating, but I love such mix-ups!
Khaki for me as an Indian is used to mean the color of police uniforms here. We call them Khakis. It's a dusky brown color. Except that and bungees, I'm not familiar with the other words
Not even solely the army. pyjamas, dekko, dungarees, gymkhana, bangle, pundit, verandah. The list goes on and on. India has been a large source of loanwords over the centuries.
Yes! This so much! In my circles, I have seen a tendency to perceive fiction as a kind of low-brow, less intellectual reading. But then these people go on and pick up self-help non-fiction books.
Fiction has so much more to offer! On top of what you wrote, fiction helps you to develop an ability to put yourself in others' shoes. Empathy is anyway scarce in this politically-charged and ragebait-filled world.
Fiction has helped me develop empathy and to stay empathetic. It has helped me develop my philosophy of life; morals and values I strive to stay close to. The fictional characters have given me courage during hard times. And so much more.
Lot of people prefer to start with self-help kind of non-fiction which is, IMO, the least helpful category of books. I don't know what draw people to it.
After I publish a blog post, I sit back and look at the published post. At that point, I feel a lasting moment of fulfillment. Whether or not I get views on that post doesn't matter. I write for this feeling of fulfillment.
I don't get that feeling after I put out a post on Bluesky.
> Whether or not I get views on that post doesn't matter. I write for this feeling of fulfillment.
This is an awesome attitude to have! I also don’t like this idea going around that unless your blog gets popular, builds your brand or makes you money, it’s pointless. Blogging can be so much more than for just shallow career-related reasons.
I think CharlieDigital's point is that a bad payload will fail right at the serialisation boundary in case of .NET. We know the problem right there. Now we only need to fix the bad payload.
For TypeScript with only types and without validation, a bad payload gets through, and there is no telling where in the workflow it will explode. This could waste more time and developer resources in debugging.
The issue is that this sort of validation boilerplate shouldn't have to be written. The framework should be able to figure it out from the HTTP handler declaration. I suspect this is why FastAPI got so popular in the Python world.
IMO, a lot of the JS world seems mentally fixated on express.js-levels of abstraction still. Anything more is viewed as "magic" and viewed as suspect because it requires learning.
The irony is that the "learning" just gets applied elsewhere; there are certain foundational building blocks that I think every language and platform needs once you start building "serious" applications.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/{userId}", (int userId) => userId);
app.Run();
See `int userId`? If I call this API with `http://localhost:5123/asdf`, I will get an error because the types don't match. If I call this with `http://localhost:5123/1234` it will work fine. The same would be true if I required a class `User` here. The router is able to introspect the type at runtime to determine if the types match; both basic types like this as well as complex types using the built-in serializer. It is built in.
I’m not sure why you’re so obsessed with this. You can do the same thing with any validation library in nodejs. Your exact example is possible by integrating any validation library of your choosing into a nest js route pipe. In particular primitive type validation is built into nestjs anyway
The fact that it’s built in is neat but not really important. Most people are not making thousands of toy apps. If the necessary they will integrate and move on.
There are more compelling reasons to use .net than this.
> Database management
> syncing with the backend server
Do features like these, when implemented in Racket, consume more resources (battery, CPU, etc.) than if they were implemented using the native API equivalents (e.g., NSURLSession or whichever is more applicable)?
In the larger context of cross-platform apps with a common core written in a non-native programming stack, I often wonder this about network and disk I/O management. I understand using the native APIs for other "I/O" like UI, hardware interfaces (bluetooth, accelerometer, etc.), because they often don't have an
equivalent API in the programming stack used to implement the common core.
As far as I know, Capacitor wraps over the native APIs.
Ultimately, you end up calling some system API for I/O, so the only difference is how efficient the implementations of those Frameworks are compared to the embedded language's implementations. On iOS, embedding Racket requires using an interpreted mode (as opposed to Racket's usual native compilation mode), so there is a small hit, but it's not one that is really noticeable in battery or CPU consumption. In fact, Podcatcher seems to do better in battery consumption compared to the competition in my (and my friend's) testing, but I would guess that's not necessarily _because_ of Racket; it probably has more to do with how the system as a whole pays attention to perf.
That makes sense. Do you keep the in-memory data in Racket data structures? I imagine keeping the data fed to Swift UI in sync with data maintained by GC'd Racket would involve some work.
Yes, the app uses Noise under the hood, and the way to think about it is a request-response model[1]. Swift makes an async request to the Racket backend, it constructs some data (either by querying SQLite, or making a request to the backend, etc.) and returns a response. If it doesn't retain any of the data, then it gets GC'd. The ser/de is relatively low overhead -- if you try the app and go to Settings -> Support and take a look at the logs after using it a little, that should give you an idea of how long the requests take. The lines that start with `#` refer to Swift->Racket RPCs. Here's an example from my logs:
Some things on the Racket side are long running, like the download manager. It's like an actor that keeps track of what's being downloaded and the progress of each download. Whenever a download makes progress, it notifies the Swift side by making a callback from Racket->Swift. In this example, there is some duplication since both the Swift and Racket sides each have a view of the same data, but it's negligible.
What's not as great from a memory use perspective is how large Racket's baseline memory use is. Loading the Racket runtime and all the app code takes up about 180MB of RAM, but then anything the app does is marginal on top of that (unless there's a bug, of course).
[1]: I did this precisely because, as you say, keeping keeping data in sync in memory between the two languages would be very hard, especially since the Racket GC is allowed to move values in memory. A value you grab at t0 might no longer be available at t1 if the Racket VM was given a chance to run between t0 and t1, so it's better to just let Racket run in its own thread and communicate with it via pipes. Probably, the same would be true for OCaml.
- Both sides pass messages to each other. Both of them talk through C ABI. My model was synchronous though. Async is certainly better.
- I used the protobuf binary protocol for message passing. Faster and probably more efficient than, say, JSON. But both sides may have copies of the same data for this reason.
I've written down my approach, which roughly aligns with yours, in the project's README.
What I wanted to do was for OCaml side to allocate data in memory, and for Swift to access the same memory through some commonly agreed upon protocol (protobuf itself maybe?). But I haven't yet explored how difficult this could be with GC coming in play. I think OCaml does have a few tricks to tell GC to not collect objects being shared through C ABI (https://ocaml.org/manual/5.3/intfc.html#s:c-gc-harmony), but I haven't looked into this enough to be sure.
Your projects will sure help me figure out the concepts!
Nice! Yeah, using protobufs seems reasonable. Re. GC, Racket has support for "freezing" values in place to prevent the GC from moving them, but freezing too many values can impact the GC's operation so I'd watch out for that if that's possible in OCaml.
Thank you for posting this here, and for all the corrections. I have updated the post with them.
My idea behind a mental model is to describe how I visualise a concept in my mind when I think about it.
The level of abstraction of a mental model is supposed to keep out the details of implementation, ensuring which I failed at. Because the deeper you dig from this level, the more inaccurate things will turn out to be.
A mental model for me is meant to be only a starting point for a concept.
In other words, the aim is such that when you think about a concept, its mental model should put you into the right perspective. Right, this is how something works, now let's check out the manual to see how I can put it to use.
I've now configured my site to add this explainer to a post classified under Mental model.
I don't imagine this is a uniquely Indian phenomenon – other non-native English speakers would be doing the same.