Pragmatic Functional Programming
blog.cleancoder.com
blog.cleancoder.com
The most upsetting part is when the author brags about how Clojure programs can manipulate itself at run-time, on a website that's literally called "Clean Coder Blog". Self-modifying code is a clear opposite of clean code. Also:
> Maybe we don’t have to worry about chips with 32,768 cores on them.
Author apparently has never written a GPGPU program.
Which is neither here, not there.
Rust is like the 1/10000th of what's going on in the programming world.
Just because this new language, not even widely adopted yet, offers some way to tame certain race conditions doesn't mean the general argument in favor of FP is moot.
For one, the implementation of "immutable data structures" in Rust, as well as other parts of Rust, was inspired by FP concepts itself. So whether one goes for pure FP or uses some of its concepts in a language like Rust, the central point that FP is important holds.
>The most upsetting part is when the author brags about how Clojure programs can manipulate itself at run-time, on a website that's literally called "Clean Coder Blog". Self-modifying code is a clear opposite of clean code.
If you do it in 70s goto/spaghetti style then yes.
Else, citation needed.
Not to mention that Robert C. Martin literally wrote the book on Clean Code.
>> Maybe we don’t have to worry about chips with 32,768 cores on them. Author apparently has never written a GPGPU program.
Author apparently knows about this trivial counter-example, and speaks about general purpose CPUs, not GPU programming in his post...
I didn't say that. I'm not opposed to FP, quite to the contrary. My point is that there are better arguments for FP than those in the submission.
99% of the programmers out there never did and never will do.
This is a Lisp macro. Macros are a powerful form of abstraction. Abstractions are what us programmers create to reduce complexity and clean code.
One just needs to be mindful of how this powerful tool is wielded, just like any other tool; you can make a mess with anything.
I think there must be a (probably not yet invented) language somewhere that would allow me to write computations in immutable FP style, either as pointwise operations (i.e. stencils), or as matrix operations, but allows me to pass in some information that directly instructs the backend what it should do with the memory. I.e. I want to be able to program my own memory pools and link pointers to memory slots needed for the computations. Maybe that part could even be done using visual programming, akin to linking up GUI elements to properties in XCode: Let the compiler figure out where a memory slot is needed, do a dependency analysis for the memory slots and show graphically what slots are linked to what input and output. Then, let me add constraints to that linking and recompute a new solution whenever I move something around. The next step would be to do a performance model for each processor and figure out the best solution using machine learning, but let me actually see what the solution is without me having to go look at assembly (which, frankly, for FP frontends seems near impossible since it has even less to do with the frontend code than if you compile down something like C or Fortran).
It seems to me that this is a fairly easy problem really, and things should move to more of a mixed memory handling model, where one could use one or more of manual memory management, recycling, or GC as needed. FP language scala-native is providing both manual management and GC already, for instance...
Haskell isn't really a thing that could "want" to "position itself".
Sorry, this is blatantly wrong. The 'wires are too long' problem was solved a couple of decades ago by adding pipeline stages.
Processors can easily get faster, today, by increasing the clock speed. Problem is, the generated heat fries them. Heat is a function of voltage and frequency. You can only lower voltage so much before switching states becomes unreliable. After that the only option is to lower frequency.
Despite what some claim, multicore is no solution to speedup. Coarse or fine grain parallelism is useful only when data parallelism is possible, which applies to less than 5% of today's software (graphics, speech, deep learning, et al). Functional programming may free code from explicitly addressing variables, but FP's implicit addressing does not magically eliminate sequential dependencies.
The vast majority of processes in mainstream software are inherently sequential. Simply implementing them in an FP won't make them parallel, so adding threads won't increase speed.
And yet I still can't do anything useful with them. A language isn't just the syntax, it's also all of the functions that are defined by default.
I think we are going to see more per core "L0" caches and less reliance on the shared "L1" cache. With that many caches to juggle you want a strongly typed compiler doing it, not by hand.