3 ms·
The issue for me with languages like C# is the lack of expressiveness. Sometimes classes aren’t the abstraction I want to use. That’s why I like kotlin over J
by dartos 3y ago
The issue for me with languages like C# is the lack of expressiveness.
Sometimes classes aren’t the abstraction I want to use.
That’s why I like kotlin over Java or c#.
It’s be nice to have a language like that which targets .net
- neonsunset 3y agoC# offers multiple options for abstracting away functionality. What do you have in mind? Also, JVM ecosystem does not offer the ability to provide zero-cost abstractions, which C# does with monomorphized generics. This is a hard requirement for productive systems programming if you don't want the C level of verbosity.
- dartos 3y ago> Also, JVM ecosystem does not offer the ability to provide zero-cost abstractions This is true, wasn’t thinking about that. C# always requires me to use and organize my code into classes and my data into objects. For example, If I wanted to use higher order functions, I need to wrap functions in callables (Objects). If I wanted to throw together a quick script to test, I need to set up a program which uses some magic configurations so that I don’t need that entry point class. Granted I only worked with C# professionally for a couple of years before getting back to a Go shop, but it always felt like trying to avoid thinking in objects was fighting against the language. Personally, I like just having first class functions which take simple data structures as arguments. Modeling the world as objects just isn’t as clear to me (the old OOP vs FP discussions) Languages like C# and Java turn me off for that reason.
- prmph 3y agoExactly. I used C# for a long time, and when I started using JS, I marveled at the directness of its expressiveness, its lack of ceremony. What's actually needed is a language as direct as JS, with the bad parts stripped out, types and a proper standard lib added, and compiled to byte-code for performance. They can call it a different name if they want.
- dartos 3y agoYeah that “directness” you’re talking about is what I call “expressiveness” It’s important for how I like to code.
- benji-york 3y agoYou might like AssemblyScript (https://www.assemblyscript.org/ https://www.assemblyscript.org/)
- neonsunset 3y agoAre you sure you are talking about C# and not some other language? There is no such thing in C# as "callables". It has lambdas, Funcs and delegates. It has always had a fair share of FP features and only gained more as it kept evolving. It had higher order functions partially in the form of method group to delegates conversions since C# 2.0, released 19 years ago and to a full extent in the form of lambda expressions since C# 3.0, which also included LINQ, released 17 years ago. It is a mixed-paradigm language. On the off chance that this is trolling, I must point out that Java and C# are sufficiently distinct, with the latter leaning more heavily on offering both lower and higher level features like extensive pattern matching, LINQ, structs and pointers/byrefs. If you do have C# snippets you are unhappy with - please post them. There is likely a better way. (I noticed you posted about Callables twice, and had a quick search - it appears to be a Godot-specific abstraction imposed on C# due to inadequacy of GDScript it has to interoperate with, and has nothing to do with C# itself)
- pjmlp 3y agoUnity and Godot are both a bless and a sin for C#'s adoption. In one way, they help the adoption in the games industry, in the other hand they introduce so many anti-patterns with their reflection based SDKs, and use of magical methods instead of proper .NET code.
- dartos 2y agoCallable may have been the wrong word. I think I meant delegate. (I do work with Godot, but not in C#. Some wires must’ve gotten crossed) Regardless of the actual word, there is an extra thing I need to do to pass a function to a higher order function as an argument. I was using this as an example to demonstrate how C#’s support for the language features I like require some ceremony which reduce expressiveness and require me to think about the language more.
- neonsunset 2y agoYou didn’t. The example does not exist and the terms you used don’t apply to C#. Post an actual example (code).
- pjmlp 3y agoValhala might help there, but yeah, we are still a couple of years away and currently the best is to manually model memory with the new Panama API, definitly not the same league as C# / .NET today, which I consider the closest modern language to what Modula-3 has promised us.
- fuzztester 3y agoIn what ways is C# the closest to Modula-3's promises?
- pjmlp 3y agoNow that AOT is part of the standard toolchain, with plenty of Midori, and C++/CLI capabilities also exposed to C# Language level, a memory safe systems language with a modern type system. I would also place D and Swift into that bucket, only D never managed to really take off when it had the opportunity, and Swift is clearly at home in iDevices.
- fuzztester 3y agoThanks.
- estebarb 3y agoYou should try Java and C# again. They have added lambdas and the support for high order functions is quite good. Sure, there is missing some things like guaranteed tail call optimization.
- dartos 3y agoI have tried C# recently. They have support for these features, but they require some ceremony to use (like wrapping function arguments in a Callable), which increases friction, signal to noise ratio, and decreases the expressiveness that I want. I just want to write what I want without having to think too much about how the language wants me to write it. Go is good for that. JS too, but has a lot of historical cruft.
- kkukshtel 3y agoI feel like your "recent" must have still been years ago. Modern C# is as terse as Python/TS/Js for basically any equivalent task, if not more so. Dotnet 8 even make the following possible: var foo = [1,2,3]; Add on switch expressions, primary ctors, first class functions, no ceremony in Program.cs anymore... it's hard to get more terse and expressive unless you want lots of chained single symbol operators (look at F#).
- neonsunset 3y ago(slight correction: `var foo = [1, 2, 3];` requires natural types for collection literals (it needs to infer the best type for var), this is coming in C# 13 (.NET 9, this November), but otherwise `int[] numbers = [1, 2, 3];` works)
- kkukshtel 2y agoYou're right! I remember some session where they talked about wanting to infer a natural type for stuff like that but its obviously a big question. But as you said declaring the type directly allows it to work. However the other nice part is that you _can_ do this: void myFunc(List<int>){} myFunc([1,2,3]); The expression sytanx can infer the type from the caller syntax so you can just inline the array declaration.