News for hackers. Stuff that matters.
Re:Diminishing returns of static typing by flavio81 on Monday October 02, 2017 @01:30PM (#15385892)
What amuses me in all "static typing versus..." discussions, is that it usually it is the comparison between two camps:

Camp A: Languages with mediocre static typing facilities, for example:

     -- C (weakly typed)
     -- C++ (weakly typed in parts, plus over-complicated
        type features) 
     -- TypeScript (the runtime is weakly typed, 
        because it's Javascript all the way down)
Camp B: Languages with mediocre dynamic typing facilities, for example:

     -- Javascript (weakly typed) 
     -- PHP 4/5 (weakly typed) 
     -- Python and Ruby (no powerful macro system to 
        help you keep complexity well under control 
        or take fulll advantage of dynamicism)


Both camps are not the best examples of static or dynamic typing. A good comparison would be between:

Camp C: Languages with very good static typing facilities, for example:

     -- Haskell
     -- ML
     -- F#
Camp D: Languages with very good dynamic typing facilities, for example:

     -- Common Lisp
     -- Clojure
     -- Scheme/Racket
     -- Julia
     -- Smalltalk

 
I think that as long as you stay in camp (A) or (B), you'll not be entirely satisfied, and you will get criticism from the other camp.
Re:Diminishing returns of static typing by andrewla on Monday October 02, 2017 @03:04PM (#15386857)
It's Camp D that I'm least familiar with here; outside of academic projects in lisp/scheme I've never used them for anything serious.

What exactly does it mean to have "good dynamic typing facilities"?

Re:Diminishing returns of static typing by Lutia on Monday October 02, 2017 @05:29PM (#15388111)
> What exactly does it mean to have "good dynamic typing facilities"?

To quote Peter Norvig on the difference between Python and Lisp, but you could apply it to most other mainstream dynamic languages vs Lisp :

> Python is more dynamic, does less error-checking. In Python you won't get any warnings for undefined functions or fields, or wrong number of arguments passed to a function, or most anything else at load time; you have to wait until run time. The commercial Lisp implementations will flag many of these as warnings; simpler implementations like clisp do not. The one place where Python is demonstrably more dangerous is when you do self.feild = 0 when you meant to type self.field = 0; the former will dynamically create a new field. The equivalent in Lisp, (setf (feild self) 0) will give you an error. On the other hand, accessing an undefined field will give you an error in both languages.

Common Lisp has a (somewhat) sound, standardized language definition, and competing compiler/JIT implementations that are much faster than anything that could ever possibly come from the Python camp because the latter is actually too dynamic and ill-defined ("Python is what CPython does") and making Python run fast while ensuring 100% compatibility with its existing ecosystem, without putting further restraints into the language, is akin to a mirage.

Re:Diminishing returns of static typing by catnaroek on Monday October 02, 2017 @06:34PM (#15388556)
What does “somewhat sound” mean?
Re:Diminishing returns of static typing by flavio81 on Monday October 02, 2017 @06:53PM (#15388675)
I think he refers to some of the usual criticisms of Common Lisp:

1. The language specification is very big. This is true, it is a very big specification. On the other hand, this is mostly caused because the language spec also includes the spec for its own "standard library", unlike what happens in C or Java, for example, where the Std. lib is specified elsewhere. CL's "standard library" is very big, because there are many, many features.

The other reason the spec is so big, is that this is a language with a lot of features - you can do high level programming, low level, complex OOP, design-your-own OOP, bitwise manipulation, arbitrary precision arithmetic, dissasemble functions to machine language, redefine classes at runtime, etc etc etc.

Probably the extreme of the features is that there is a sql-like mini-programming language built in just for doing loops (!), "the LOOP macro". On the other hand, you can choose not to use it. And if you use it, it can help you write highly readable and concise code. More info:

http://cl-cookbook.sourceforge.net/loop.html

2. The "cruft"; Common Lisp is basically the unification ("common") of at least two main Lisp dialects that were in use during the 70s. So there are some parts (mind you, just some) in which some naming or function parameter orders could have been more consistent; for example here everything is consistent:

    ;; access a property list by property
    (getf plist property)

    ;; access an array by index
    (aref array index)

    ;; access an object's slot
    (slot-value object slot-name)
... but here the consistency is broken:

    ;; gethash: obtain the element from a hash table, by key
    (gethash key hash-table)
There is also sometimes some things that seem to be redundant, like for example "setq", where "setf" can do everything you can do with "setq" (and more); or for example "defparameter", and "defvar" where in theory "setf" might be enough. But there are differences, and knowing such differences help to write more readable and better code. And it's really nitpicking, for these are easy to overcome.

3. Because of the above, CL is often criticized because of being a language "designed by committee". But, unlike other "committee-designed languages", this one was designed by selecting, from older Lisps, features that were already proven to be a Good Thing, and incorporating them into CL without too many changes. So you can also consider it to be "a curated collection of good features from older Lisps..."

4. Scheme, the other main "Lisp dialect", has a much, much smaller and simpler spec, so it's easier to learn. But on the other hand this also means that many features are just absent, and will need to be implemented by the programmer (or by external libs), without any standarization. On the other hand, due to the extensive standarization, usually Common Lisp code is highly portable between implementations, and often code will run in various CL implementations, straight away, with zero change.

Historically, Scheme was more popular inside the academic community while Common Lisp was more popular with production systems (i.e. science, space, simulation, CAD/CAM, etc.) Thus, there used to be an animosity between Schemers and Lispers, although jumping from one language to other is rather easy...

Re:Diminishing returns of static typing by kazinator on Tuesday October 03, 2017 @10:01AM (#15392450)
ANSI CL is what some 1100-something pages?

JavaScript is up to 885 pages. https://www.ecma-international.org/publications/files/ECMA-S...

The C++ 17 draft: 1623 pages. https://www.ecma-international.org/publications/files/ECMA-S...

C, which "is not a big language, and is not well served by a big book", according to Thompson and Ritchie's 1988 introduction in the K&R2, is up to 683 pages in C11. Almost triple the size of C90's 230 pages.

How about something non-language? USB 3.2 spec (just released Sep 22): 100+ megabyte .zip file download. Up from 2.0's 73.

Re:Diminishing returns of static typing by catnaroek on Monday October 02, 2017 @07:10PM (#15388745)
0. There is nothing wrong with big standard libraries, so long as they are not redundant and the core language is small.

1. This is a serious criticism, but it has nothing to do with soundness.

2. There is absolutely nothing wrong with a language being designed by a committee, so long as the committee's members are all competent.

3. Back to 0.

Re:Diminishing returns of static typing by flavio81 on Monday October 02, 2017 @07:17PM (#15388780)
>2. There is absolutely nothing wrong with a language being designed by a committee

It sort of has a bad stigma, because two well-known, unloved languages were designed by committee: COBOL and PL/I.

Re:Diminishing returns of static typing by kazinator on Tuesday October 03, 2017 @10:02AM (#15392459)
Today, those roles are played by C++17 and C11.
Re:Diminishing returns of static typing by pkd on Monday October 02, 2017 @04:10PM (#15387481)
If you Google, you can find tons of good stuff written in Lisps. Julia is an up-and coming language - but it is highly regarded by the data science community.

> What exactly does it mean to have "good dynamic typing facilities"?

The ability to change the structure of your program at runtime will be at the top of the list for me. You can't do that with Ruby/Python.

Re:Diminishing returns of static typing by flavio81 on Monday October 02, 2017 @04:30PM (#15387655)
>What exactly does it mean to have "good dynamic typing facilities"?

Picking Common Lisp as an example:

(NOTE: Some of the features are also present in good statically typed languages as well, so what I advocate is to use good, well-featured languages, not really static vs dynamic.)

(NOTE 2: I'm sorry for being such a fanboy, but that thing is addictive like a hard drug...)

0. Code is a first class citizen, and it can be handled just as well as any other type of data. See "macros" below.

1. The system is truly dynamic: Functions can be redefined while the code is running. Objects can change class to a newer version (if you want to), while the code is running.

2. The runtime is very strong with regards to types. It will not allow any type mismatch at all.

3. The error handling system is exemplary: Not only designed to "catch" errors, but also to apply a potential correction and try running the function again. This is known as "condition and restarts", and sadly is not present in many programming languages.

4. The object oriented system (CLOS) allows multiple dispatch. This sometimes allows producing very short, easy to understand code, without having to resort to workarounds. The circle-ellipse problem is solved really easily here. (Note: You can argue that CLOS is in truth a statically typed system, and this is partly true -- the method's class(es) need to be specified statically, but the rest of arguments can be dynamic.)

5. The macro system reduces boilerplate code to exactly zero. And also allows you to reduce the length of your code, or have very explicit (clear to read) code at the high-level. This brings down the level of complexity of your code, and thus makes it easier to manage. It also reduces the need for conventional refactoring, since macros can do much more powerful, automatic, transformations to the existing code.

6. The type system is extensive -- i am not forced to convert 10/3 to 3.333333, because 10/3 can stay as 10/3 (fractional data type). A function that in some cases should return a complex number, will then return the complex number, if that should be the answer, rather than causing an error or (worse) truncating the result to a real. Arbitrarly length numbers are supported, so numbers usually do not overflow or get truncated. (Factorial of 100) / (factorial of 99) gives me the correct result (100), instead of overflowing or losing precision (and thus giving a wrong result).

So you feel safe, because the system will assign your data the data type that suits it the best, and afterwards will not try to attempt any further conversion.

7. The type system is very flexible. For example, i can (optionally) specify that a function's input type shall be an integer between 1 and 10, and the runtime will enforce this restriction.

8. There is an extensive, solid namespace system, so functions and classes are located precisely and names don't conflict with other packages. Symbols can be exported explicitely. This makes managing big codebases much easier, because the frontier between local (private) code versus "code that gets used outside", can be made explicit and enforced.

9. Namespaces for functions and variables (and keywords, and classes) are separate, so they don't clash. Naming things is thus easier; this makes programming a bit more comfortable and code easier to read.

10. Documentation is built into the system - function and class documentation is part of the language standard.

11. Development is interactive. The runtime and compiler is a "living" thing in constant interaction with the user. This allows, for example, for the compiler to immediately tell you where the definition of function "x" is, or which code is using such function. Errors are very explicit and descriptive. Functions are compiled immediately after definition, and it can also be dissasembled (to machine language) with just a commmand.

12. Closures are available. And functions are first-class citizens.

13. Recursion can be used without too many worries -- most implementations allow tail call optimizations.

14. The language can be extended easily; the reader can also be extended if necessary, so new syntaxes can be introduced if you like. Then, they need to be explicitely enabled, of course.

15. There is a clear distinction between "read time", "compile time" and "run time", and you can write code that executes on any of those three times, as you need.

16. Function signatures can be expressed in many ways, including named parameters (which Python also has and IMO is a great way to avoid bugs regarding to wrong parameters / wrong passing order.)

Re:Diminishing returns of static typing by boramalper on Monday October 02, 2017 @06:55PM (#15388689)
> 3. The error handling system is exemplary: Not only designed to "catch" errors, but also to apply a potential correction and try running the function again. This is known as "condition and restarts", and sadly is not present in many programming languages.

I found this extremely weird and (or hence) interesting at the same time. Where can I read more about this?

Re:Diminishing returns of static typing by flavio81 on Monday October 02, 2017 @07:25PM (#15388812)
You are welcome, sir! How about this chapter of the famous book "Practical Common Lisp", available online for free?

http://www.gigamonkeys.com/book/beyond-exception-handling-co...

Re:Diminishing returns of static typing by sigstoat on Monday October 02, 2017 @07:08PM (#15388742)
googling for "common lisp condition system" turns stuff up. i looked at one point, and i don't remember finding an academic treatment of them.

they're (hand wave hand wave) basically a matter of stuffing the current continuation inside of the exception, whenever you throw an exception, and then making use of that to provide more options whenever the exception is caught.

Re:Diminishing returns of static typing by richdougherty on Monday October 02, 2017 @03:48PM (#15387299)
Languages like TypeScript and Racket are also interesting because they let you shift camps partway through the project - you can start of untyped and then add typing annotations.

https://en.wikipedia.org/wiki/Gradual_typing

Re:Diminishing returns of static typing by Tade0 on Monday October 02, 2017 @02:07PM (#15386269)
Perhaps it's because the languages you mentioned barely register in statistics(aside from Clojure maybe).

Maybe it's simply hard to have both a good type system and a friendly learning curve?

Re:Diminishing returns of static typing by bad_user on Monday October 02, 2017 @02:11PM (#15386303)
The other possibility is that the industry suffers from anti-intellectualism, so we keep reinventing the same 2 languages.
Re:Diminishing returns of static typing by Tade0 on Monday October 02, 2017 @04:32PM (#15387679)
Do you believe that this is plausible?
Re:Diminishing returns of static typing by flavio81 on Monday October 02, 2017 @05:44PM (#15388230)
I think this has happened for a long time. First (70s), features from Algol-68, like structured programming or better flexibility for data types, were ported to other languages. Then (80s-present), the features from Smalltalk and Lisp started slowly to be ported to other languages, many times in an incomplete or unelegant way.

We're still doing this, for example the last production spec of the Java language finally incorporated a mechanism to pass functions as input parameter on a method. And the next version of Java (9) will attempt to have some interactivity, with a kind of REPL. This, coupled with the powerful facilities of good Java IDEs, will give Java developers of 2017 the level of Interactivity and easiness of development that Smalltalk and Lisp users have enjoyed since the late 70s. Sad but true.

Julia -an interesting language, by the way- borrows multiple dispatch from the Common Lisp Object System (CLOS), among other features. CLOS itself was a further evolution of the OOP brought to the table by Smalltalk, invented by a true genius: Alan Kay.

Rust is basically a "fixed C++", that is, a more usable, less annoying C++.

So it's difficult to say there are truly new things in programming language. But it's not everything limited to Smalltalk and Lisp -- Prolog, ML (and OCaml, F# and Haskell) do bring new concepts to the table, and are worth checking out.

Re:Diminishing returns of static typing by blub on Tuesday October 03, 2017 @03:29AM (#15390778)
You managed to pick the two things where Rust is actually not improving on C++, because it's both more annoying and less usable compared to C++.

There's a reason the expression "fighting the borrow checker" was coined.

You're confusing your own biases and preferences for facts.

Re:Diminishing returns of static typing by Tade0 on Tuesday October 03, 2017 @05:13AM (#15391151)
I find this whole "fighting the borrow checker" thing a tad inflated. I personally don't "fight" it anymore, because it's a simple rule to anyone who's familiar with pointer arithmetic.

Also the compiler usually tells you what is it exactly that you screwed up this time and how to get out of this mess, which cannot be said about C++.

Re:Diminishing returns of static typing by bad_user on Tuesday October 03, 2017 @11:18AM (#15392960)
In absence of a garbage collector, what people don't get is that it's really easy to screw up by creating race conditions or memory leaks.

If fighting the borrow checker is annoying, that's because you don't get memory safety otherwise.

The vast majority of vulnerabilities in the wild are created because of sloppy usage of C / C++, which is basically unavoidable in absence of expensive static analyzers that become as annoying as Rust, while not being as good.

Re:Diminishing returns of static typing by flavio81 on Monday October 02, 2017 @03:19PM (#15387012)
>friendly learning curve

To be honest, i love Common Lisp, it might be the most powerful programming language out there, but it's not easy to learn at all. In part because, being a truly multi-paradigm language, you should better make sure you are well versed in most programming paradigms first, otherwise you won't leverage the full power of Lisp. Not to mention the paradigm of meta-programming and DSLs, something that is usually new to programmers foreign to Lisp.

However, languages like Clojure and Smalltalk can be rather easy to learn, and they are fairly powerful.

Smalltalk was designed to be taught to kids!!

Re:Diminishing returns of static typing by Tade0 on Monday October 02, 2017 @04:30PM (#15387656)
>Not to mention the paradigm of meta-programming and DSLs, something that is usually new to programmers foreign to Lisp.

Is it really? What about templates(as in C++ templates), macros, CSS and HTML? These are two examples of metaprogramming and two DSLs respectively.

> However, languages like Clojure and Smalltalk can be rather easy to learn, and they are fairly powerful.

It's not like I don't believe you, but if this is true, then where's the popularity? Why isn't it there? I'm asking because I genuinely don't know.

EDIT: punctuation.

Re:Diminishing returns of static typing by flavio81 on Monday October 02, 2017 @05:09PM (#15387972)
>Is it really? What about templates(as in C++ templates), macros, CSS and HTML?

"Lisp macros" go far, far beyond "C macros" ("preprocessor macros", and indeed go far beyond what you can do with C++ templates. You should take a look, but basically, explained in a few words:

In Lisp, code is data. Code is a first-class citizen. The functions and constructs that are there to manipulate data, also manipulate source code with the same easiness. So your code can manipulate code very, very easily. Writing code that creates code "on the fly" -be it at compile time or at runtime- is not only possible, it is also very easy to do, and it is 95% similar to writing regular code.

Thus, Lisp is sometimes described as "the programmable programming language."

>It's not like I don't believe you, but if this is true, then where's the popularity?

"Programming is pop-culture" -- Alan Kay.

The reasons a programming language gets highly popular is not always related to the quality of it. There are also other reasons. Consider Javascript for example. Before the ES6 specification, it was plainly a horrible programming language, full of pitfalls and missing features. You couldn't even be sure of the scope of the variable you just declared!! But it went popular, simply because it was the only programming language usable on all web browsers.

C, for example, was never a great programming language. But it ran efficiently on any hardware, so it started as a (very good) alternative to assembler. And then got more traction.

Then object-oriented programming got popular, because it allowed you to do nice stuff (on the Smalltalk language, where it was very well implemented). So somebody said: ok, i want C with object orientation, and C++ was invented, which wasn't a very good object oriented language, but since C was popular, and OOP was the next big thing, it got wildly popular.

C and C++ languages require you to manually manage memory, unlike in Smalltalk or Lisp, where the memory was automatically managed. So somebody at Sun said "ok, let's make a language with syntax similar to C++, but with automatic memory management", and Java was born, and thus, due to the small learning curve, and a LOT of marketing, went wildly popular, although many of the problems of C++ were present, plus it introduced limitations of its own. (I, as a student, loved Java when i learnt it, after having to use C++. How naive i was!!)

And the story goes on and on.

So it's more about riding the wave of popularity, rather than using the best tool for the job. It has also something to do with the triumph of UNIX over other operating systems. Otherwise, Smalltalk [what the groundbreaking Xerox machines used] and Lisp [what the groundbreaking Lisp Machines, and also the Xerox machines used] would be way more popular.

It also has something to do with speed -- Lisp (in the 60s) used to be a very slow language. Smalltalk (in the 70s and early 80s) used to run very slow as well. They also required a huge amount of memory. Nowadays they are not really memory hungry, and they can run very fast.

Some problems are much easier to express in Prolog, or Haskell, than Java or C++ or javascript; but they aren't popular languages. Popularity sometimes is harmful...

Re:Diminishing returns of static typing by z3t4 on Tuesday October 03, 2017 @04:24AM (#15390971)
JavaScript was very nice before ES6. All ES6 did was to add syntax sugar/meta. var in JavaScript belongs to the function it is declared in. ES6 made the language way more complicated, and divided the community up into more dialects. The plan was to unite compile-to-JavaScript communities like CoffeeScript, but that didn't work because there's more compile-to-JavaScript languages now then it ever has been.
Re:Diminishing returns of static typing by fori1to10 on Monday October 02, 2017 @03:08PM (#15386901)
The learning curve for Julia is very easy.
Re:Diminishing returns of static typing by bbatha on Monday October 02, 2017 @02:02PM (#15386228)
> Ruby

Ruby has some of the best meta-programming facilities out there. Yes you can't manipulate syntax in the same way as lisp, but the fact that all methods are message passing and first class blocks make tons of very powerful meta programming possible. Basic features that look otherwise first class are based on Ruby's meta programming facilities like `attr_reader` and friends. Funnily enough, the meta programming facilities of Ruby are precisely what turns a lot of people off. The wtfs per minute of using something like ActiveRecord is super high for people with only passing familiarity because there's so much that that's defined through Ruby's meta programming facilities.

Re:Diminishing returns of static typing by jaggederest on Monday October 02, 2017 @02:37PM (#15386543)
I say this as someone that has used and loved Ruby for more than ten years now:

Smalltalk has worlds better dynamic and metaprogramming.

That said, ruby does have a lot of power, but it's not of the same order as self/smalltalk etc.

Re:Diminishing returns of static typing by flavio81 on Monday October 02, 2017 @03:27PM (#15387095)
>Ruby has some of the best meta-programming facilities out there.

Ruby has meta-programming facilities, but they pale compared to the easiness of doing meta-programming in Common Lisp. In Ruby, meta-programming is an advanced topic (see for example the implementation of the RoR ActiveRecord). In Lisp, meta-programming is your everyday bread&butter, and one of the first things a beginner learns. Because it isn't too different from regular programming!!

[The same comment applies, mostly, also to Clojure, Racket, Scheme, and the other Lisps]

Re:Diminishing returns of static typing by woolvalley on Monday October 02, 2017 @03:05PM (#15386868)
So where does Java & C# fit in those categories?
Re:Diminishing returns of static typing by richdougherty on Monday October 02, 2017 @03:46PM (#15387284)
Probably Camp A. They have some static typing, but it's pretty basic. Then again, according to the article posted, they may be in the "sweet spot" for many purposes.
Re:Diminishing returns of static typing by Inityx on Monday October 02, 2017 @02:35PM (#15386520)
Where's Rust in here?
Re:Diminishing returns of static typing by alkonaut on Monday October 02, 2017 @03:44PM (#15387272)
Category C
Re:Diminishing returns of static typing by arunix on Wednesday October 04, 2017 @09:01AM (#15400127)
How are the dynamic typing facilities in Smalltalk better than those in Ruby?
Re:Diminishing returns of static typing by fulafel on Monday October 02, 2017 @02:11PM (#15386310)
What makes you put Python and JS in the same basket here? Python is widely raised as a language that has a good dynamic typing system with strong types and good type error handling - arguably better than Lisps (nil punning). JS is infamous for the opposite. Macros are quite orthogonal to this.
Re:Diminishing returns of static typing by nnq on Monday October 02, 2017 @03:58PM (#15387387)
> Macros are quite orthogonal to this.

You ain't gonna to find any sane way to combine macros with a powerful type system in a way the doesn't make a 140+ IQ a requirement for any programmer touching the code using these features in a real world project...

Problem with programming language design is that the ideal/Nirvana solutions lie at the edge, or beyond, the limits of human intellect. If you want something that can be learnt and understood with reasonable effort (like in not making "5+ years experience" a requirement for even basic productivity on an advanced codebase), you're going to have to compromise heaviliy! The most obvious ways to compromise are throwing away unlimited abstraction freedom (aka "macros"), or type systems.

Sorry to break it to ya, but we're merely humans, and not that smart...

Re:Diminishing returns of static typing by pkd on Monday October 02, 2017 @04:16PM (#15387529)
There is a programming language property called Restrictability - it means that you only need to know a subset of the features the language provides to become productive. The best languages have high restrictability without compromising on the high level features like powerful macros.

The point of having macros is that they allow you to solve problems that cannot be solved elegantly in any other way. But 95% of programmers don't need to solve such problems and can do very well without using macros.

Re:Diminishing returns of static typing by nnq on Tuesday October 03, 2017 @04:40AM (#15391035)
> Restrictability - it means that you only need to know a subset of the features the language provides to become productive

Thanks, but.... NO THANKS! It's basically what makes languages like Scala or C++ horrible - a false sense of "you only need to know this subset of the language" and then you see that in real life: (1) nobody agrees on what that subset is and (2) you are going to have to hack your way through the most advanced frameworks and libraries (written by folk way smarter than you) and you are going to need to do it under unreasonable time pressure!

If a feature exists in the language you will be forced to understand it and become proficient at using it, whether you like it or not. Otherwise you're a "play pen programmer", only comfortable in his little patch of expertise.

I'm personally an "Expert Generalist" and like to be confident I can hack my way through anything this shitty life throws at me ;) This is kind of why I'm starting to love forcefully minimalistic, abstraction-wise-rigid, and intentionally "retarded" languages like Go nowadays :) (But yeah, when dynamic is the way to go, I'd prefer a Lisp with macros any time - one extreme or another, never the middle way, I'm not smart enough for it.)

Re:Diminishing returns of static typing by kazinator on Tuesday October 03, 2017 @02:40PM (#15394870)
> it means that you only need to know a subset of the features the language provides to become productive.

That only works when you work by yourself (or in a small team to whom you can dictate the language subset), and without any third party code.

> But 95% of programmers don't need to solve such problems and can do very well without using macros.

Languages that have great macro systems use them to bootstrap themselves. So when you use the standard, documented features, you're using macros.

E.g. if you're writing in Lisp and your file begins with (defun ..., you've just used a macro.

Re:Diminishing returns of static typing by pkd on Wednesday October 04, 2017 @03:44PM (#15403846)
Sure, you can use them as a consumer all the time, but that doesn't mean that you need to write your own to program in Lisps, for instance. For the few that do need it, it's a worthy tool to have.
Re:Diminishing returns of static typing by fulafel on Monday October 02, 2017 @05:24PM (#15388089)
Rust has macros that seem well liked, and everyday stdlib constructs are implemented using them. Though I can easily believe that the average Rust macro is authored by a smart person.
Re:Diminishing returns of static typing by flavio81 on Monday October 02, 2017 @03:28PM (#15387112)
>What makes you put Python and JS in the same basket here?

I'm very well versed in Python (i've delivered two financial software systems done in Python, written entirely by yours truly). However its features and facilities pale in comparison to the languages i listed in camp "D".