[Haskell-cafe] Speculation, OT: Program a Spreadsheet

Joachim Durchholz jo at durchholz.org
Sun Nov 19 12:04:04 UTC 2017

Am 19.11.2017 um 08:05 schrieb trent shipley:
> * Is a spreadsheet you can program from the spreadsheet a reasonable goal?

I.e. use the same programming language for cells formulae and scripts?
Yes, that's very much reasonable.

> * Has it been done?

Not in any mainstream spreadsheet. Which boils down to two: Excel and 
Open/Libre Office Calc.
Excel offers VBA.
Calc is actually language-agnostic and uses URLs and XML to tie things 
together. It currently supports BeanShell (Java-without-types, it 
seems), Java, JS, Python, and OO Basic.

> So the plan is to take something like GNUmeric or LibreOffice Calc and 
> graft on a primitive function sheet interpreter.

The main point is that you'd have to replace the formular language.
I do not think that Calc was made for that.

> It would be natural to use C++,

You'd instantly kill adoption with that. Only a minimal part of the Calc 
user base is even remotely capable of coding formulae in C++, and even 
of these, a substantial fraction would be able but unwilling.

 > but the astute will note that a
> spreadsheet basically does not rewrite cells (unless you use a circular 
> reference), so I'd also like to use a functional language, maybe Haskel.

You don't want to inline the formulae of other cells anyway, because 
then the calculation will be done twice: Once to fill the referenced 
cell, and once as part of the referencing cell.

So for reference cycles, you'll rely on whatever the spreadsheet is 
already doing to deal with them.

> * Would using a functional language as a basic language of the project 
> save effort and intellectual load?

That depends on whether you're talking about the implementation language 
or the cell/macro language.

For the implementation language, you'll save the most time by using 
whatever you already know. Unless the project is going to last longer 
than, say, two years. And if you plan on getting other people to join 
the project, you'll want the language with the largest pool of 
interested and able people, which is essentially guesswork but I'd 
avoid, say, the VBA or PHP crowd ;-)

For the user-facing language, do whatever is easy to use for a 
non-programmer. Haskell should work fine, but prepare to collect 
references to tutorials, and what does *not* work fine is performance 
predictions, particularly not for nonprogrammers. This probably means 
you need strict evaluation, which means even if it looks like Haskell 
it's going to be an entirely different language.

> In the longer term I'd like as much of the spreadsheet programmable as a 
> spreadsheet to be written to run on the JVM.
> As near as I can tell near future Java and typed functional languages, 
> include the following options:
> Eta,
> Frege,
> Kotlin and,
> Scala.

I don't know any of these well enough to make any recommendations.

However, for the user-facing language, you need this:
1) As easy to learn as possible.
2) Scales well to a few thousand lines of code. The learning curve must 
not have bumps along that road, because with every bump, a substantial 
fraction of the user base will be deterred from progressing to more 
complicated tasks.
3) You'll need good support for large-scale programming if you want to 
enable "just calling" into third-party modules (which would be pretty 
appealing to people who use Calc for nontrivial stuff). The JVM excels 
at this, BTW, though if you don't use Java, a substantial fraction of 
Maven modules will be awkward to use.

For (3), you'll need static typing.
For (1) - and arguably (2) and (3) as well - you need something that is 
excellent at type inference.

Type inference does not work well for updatable data structures, so you 
will want something that excels at handling immutable data. Which 
essentially rules out C++ or any other imperative language.
The type system is a real problem. For many real-world situations you 
need dependent types, but these have complicated error situations so 
newbies will usually be unable to deal with it, which means a bump in 
the learning curve. I don't know of a good way to deal with that, it's 
just on the list of things that I routinely check if somebody asks me to 
take a look at his great new language :-) (Haskell people excel at 
bending its type system to simulate all kinds of things, and I wouldn't 
be surprised if nobody had tried to achieve most dependent-type benefits 
from Haskell's type system; however, people using such a type framework 
will need to know the Haskell type system and the internals of the 
framework to make sense of any error messages that come out of a type 
bug, so this is a variant of programmer's golf, not something you want 
for newbies and learners.)

The JVM would be desirable, but typical .jar modules make heavy use of 
mutable data. So you need something that's alien to mutable data types 
but not incompatible with then; that's a relative fine line that the 
language design would have to strike.
I'd probably use a language that allows mutables but disallows aliases 
to them. Clean does this via the type system, other strategies might be 
work. However, given that arbitrary modules from the JVM ecosystem might 
throw aliased updateable references left and right, all guarantees are 
off as soon as a computation relies on data provided from a JVM module, 
so maybe it's still not worth using that. (Java folks have been thinking 
about "value types", i.e. immutables, for a while now, but I don't see 
that coming any year soon.)

Evalutation strategy is another issue.
Non-strict has some nice properties, in particular you don't need to 
differentiate between an expression and its value. However, nonstrict is 
difficult to control performance-wise, and I still see people struggle 
if they see that their code is unexpectedly slow.

> Note that a spreadsheet needs to give the satisfaction of immediate 
> results, or failing immediate results, the sensation of actively 
> working, so if the language could be interpreted that would be a huge help.


> * Which combination of typed, compiled, interpreted, FOSS functional 
> language that runs on the JVM, JAVA, Haskell, C++, C, used in that order 
> of preference, makes the most sense for the Java compatible functional 
> language at the top of the preference hierarchy?

C++ and C aren't worth it if you plan to go for the JVM.
Don't know if there's a useful JVM port of Haskell.

You *can* interface with OO using XML descriptors and such, so the JVM 
isn't your only option. You could even use (or invent) a language that 
compiles to binary, with LLVM that has become a realistic option.
However, plan to invest some time into understanding LLVM.

> Note also, that I have only the equivalent of an AA degree from a CIS, 
> not a CS, perspective, so the odds are the whole idea is vaporware, 
> unless I can determine feasibility and desirability,

I suspect that no existing language fits the bill.
Given your background, you'll need somebody with language design 
experience; language design is hard because of so many conflicting goals.

 > then sweet talk
> real developers to help out.

That's a good plan :-)

More information about the Haskell-Cafe mailing list