Fork me on GitHub
#hoplon
<
2016-04-10
>
l1sp3r13:04:50

So started looking at hoplon

l1sp3r13:04:55

Really nice

l1sp3r13:04:06

Had a question about performance

l1sp3r13:04:28

Let's say we were rendering a long list of elements

l1sp3r14:04:38

Existing VDom Impls use diffing to only change the existing Dom

l1sp3r14:04:13

So let's say I had a list with 10000 elements in it

micha14:04:22

ok so a couple of things

l1sp3r14:04:28

And I add an element at position 5000

micha14:04:42

yeah hoplon will only add one element to the dom

micha14:04:57

but hoplon has no virtual dom or anything like that

l1sp3r14:04:57

Interesting

micha14:04:48

hoplon cleanly separates the dom, which is by definition mutable, from the application state, which is data (and immutable, stored in reference types -- javelin cells)

micha14:04:04

so there is no "rendering" in hoplon

micha14:04:16

you create real dom elements, that's it

micha14:04:38

you're familiar with the virtual dom way of doing things?

micha14:04:11

like react, mithril, elm, stuff like that?

micha14:04:05

like in those frameworks you have a pure function that emits the virtual dom

micha14:04:23

that is what gets diffed with the actual dom to produce the delta

micha14:04:33

and the delta gets applied to the actual dom

micha14:04:04

the pure function gets a snapshot of the entire application state passed to it

micha14:04:14

it computes the next virtual dom from that

micha14:04:52

to me it's similar to the way a terminal based text editor works

micha14:04:59

you have the screen buffer

micha14:04:16

you press a key, and the next value for the buffer is computed

micha14:04:25

syntax is highlighted etc

micha14:04:32

then you print that

micha14:04:55

but there are layers of optimizations like clipping and double buffering or whatever

micha14:04:07

to reduce the redundant printing

micha14:04:57

compare that to an editor you might make in a browser

micha14:04:10

where you don't just have a terminal display

micha14:04:34

you have something more complex than just an array of pixels

micha14:04:41

you have a tree of stateful objects

micha14:04:07

so in this environment it would be natural to have elements in the tree manage their own state as much as possible

micha14:04:32

so if you type in one paragraph, the other paragraphs don't need to know about it, or be rerendered or anything

micha14:04:39

like with contentEditable

micha14:04:52

i see vdom as like emacs

micha14:04:01

and hoplon is like contentEditable

micha14:04:18

with hoplon the diffing is done in the data

micha14:04:58

(page "index.html")

(def count (cell 0))
(def color (cell= (if (= 0 (mod count 5)) "red" "blue")))
(with-interval 1000 #(swap! count inc))

(html
  (body
    (p :css (cell= {:color color})
      (span (text "count = ~{count}")))))

l1sp3r14:04:35

So my concern is that the list which will be large is held in a cell

micha14:04:52

if you run that and observe the DOM in chrome dev tools you will see that only the parts of the dom that need to change will change

l1sp3r14:04:16

So how does hoplon do list diffing?

micha14:04:50

so what you see in the example above is nice becuase all allocation is static

micha14:04:00

there is no dynamic allocation of dom elements

micha14:04:04

this is evry fast and good etc

micha14:04:22

but of course you need to dynamically allocate dom elements too

micha14:04:36

most common case is a sequence of things need to be allocated

micha14:04:46

so the loop-tpl macro does that

micha14:04:00

but it leverages static allocation

micha14:04:06

which is the best of both worlds i think

micha14:04:12

it allocates into a pool

micha14:04:24

and when the list grows it allocates more elements

micha14:04:42

when the list shrinks it removes the elements from the end and puts themn back in the pool

micha14:04:54

if the list grows again they are replaced back into the dom

micha14:04:58

but the key thing here

micha14:04:14

is that the linkages between those elements and the application state are preserved

l1sp3r14:04:22

Ah so an insert would cause things to shuffle down

micha14:04:39

like the element at position 0 in the dom is always at position 0

micha14:04:46

it never moves

l1sp3r14:04:02

I'm thinking, if I swap two elements in the source list, say at the beginning and end

micha14:04:09

the properties, like the textContent of a node might change

micha14:04:17

well you don't do that

micha14:04:33

you swap the data that those elements have wired up to their properties maybe

micha14:04:39

but the elements stay the same

l1sp3r14:04:44

No I might do that at the model level

micha14:04:46

it's like the hotel guest situation

micha14:04:57

you build the hotel and it has 100 rooms

micha14:04:10

you might have all the visitors move down one

micha14:04:17

but the rooms stay the same

micha14:04:23

the people in them change

micha14:04:37

for example

micha14:04:34

(page "index.html")

(defc items ["one" "two" "three"])
(with-timeout 1000
  (swap! items conj "four")
  (with-timeout 1000
    (swap! items #(vec (rest %))))

(html
  (body
    (ul
      (loop-tpl :bindings [item items]
        (li :text item)))))

micha14:04:53

so that will initially be a list of 3 items

micha14:04:05

after 1s a new item is added to the end of the list

micha14:04:14

so a new element is allocated and inserted into the dom

micha14:04:25

the first 3 elements in the list are unaffected

micha14:04:36

then after 2s the first item is removed

micha14:04:40

from the items cell

micha14:04:01

what happens then is that the last element in the dom list is removed from the dom

micha14:04:19

but the text content of the lis are updated

micha14:04:59

basically it works fine, no performance issues

micha14:04:23

if you're making 10000 list items that's probably a UX issue anyway

micha14:04:34

because people can't see 10000 things at the same time

micha14:04:09

we have done very little work on performance, beacuse it's just not an issue

dm314:04:53

there's some concern for the data stored in cells

dm314:04:19

if you have computationally expensive formulas and a lot of data

micha14:04:31

yeah that's just a limitation of browsers really

dm314:04:36

yeah, thinking how that's "solved" in react world

micha14:04:52

i don't think it is at all

micha14:04:13

the react model makes that worse

micha14:04:21

because there is no pruning at the data layer

micha14:04:45

you recompute things all the time, and the diffing prunes the dom updates

micha14:04:04

vs javelin pruning updatees in the data layer

micha14:04:13

so they never get to the dom in the first place

micha14:04:29

that means you don't do the data layer computations unnecessarily

dm314:04:30

I was thinking about the javelin always-consistent-cell-graph and e.g. re-frame event->handler->state-update->react-rerender models

dm314:04:46

guess in the end that's identical

micha14:04:53

re-frame is based on the hoplon model

dm314:04:05

if you have something that can be done async, you'll have to split it off manually

dm314:04:12

explicitly

micha14:04:10

since formula cells are constructed from functions you can make hand optimized javascript for them too

micha14:04:18

you don't need to use the cell= macro

micha14:04:45

we have a pretty huge application now, similar to the aws console in terms of the problem it's solving

micha14:04:59

no performance issues, it's super snappy

micha14:04:28

didn't do anything special to make it that way

micha14:04:46

the only thing we need to do is carefully manage how we fetch state from the backend api

micha14:04:00

so we have a few macros for that

micha14:04:15

to manage caches asynchronously

micha14:04:20

things like that

micha14:04:10

but one thing it does is it supports an infinite number of anything in the UI, without degrading performance

micha14:04:31

because our customers can use our api to create thousands of things very quickly

micha14:04:48

and then they want to use the UI to manipulate them

micha14:04:27

so we needed to develop a strategy for dealing with that, because the data even for a single user won't fit in memory in the browser

micha14:04:57

and we needed to have very efficient queries in the backend api

dm314:04:11

on the other hand, I have a spreadsheet-like application which allows constructing financial scenarios, using datascript to manage the pretty complicated UI model and events over websocket to allow realtime collaboration over the spreadsheet (ala google docs)

dm314:04:53

so two pretty different things working great with Hoplon

dm314:04:55

@l1sp3r: btw, another big benefit of Hoplon is Micha who'll write an essay to answer a question pretty much any time simple_smile

micha14:04:29

sorry bout that i get carried away sometimes

dm314:04:54

I wouldn't want it any other way simple_smile

micha14:04:57

@dm3: looking at mutation observers

micha14:04:38

there is the addEventListener thing too, seems to be supported in all evergreen browsers

dm314:04:38

how would you use that?

micha15:04:02

it's the older spec

micha15:04:13

i think it does the same thing as mutationobserver but in a different way

micha15:04:18

probably a tradeoff there

dm315:04:59

something needs to dispatchEvent on the target, no?

dm315:04:36

addEventListener is the basic thing if I understand correctly

dm315:04:05

it doesn't know about DOM mutations

micha15:04:19

really? what's the point of it?

dm315:04:35

well, how would you add an event listener? simple_smile

dm315:04:41

e.g. for click

micha15:04:01

i mean this:

dm315:04:19

oh, this is what preceded the MutationObserver but got deprecated

micha15:04:35

but i suspect it's better for some things

dm315:04:53

but then it might get dropped completely at some point

micha15:04:41

the future of browsers is seen only via a scanner darkly

micha15:04:49

clever boy

dm315:04:37

@micha: did you ever run into needs/wants to reproduce clientside errors or reproduce the complete state of the client? I know the guy behind re-frame touts that as a great benefit of the single state map. Remember CircleCI people blogged about this feature helping them reproduce bugs, etc... What do you think?

micha15:04:08

not really, honestly we don't have those kinds of bugs

micha15:04:18

like we have bugs of course, but they're always very easy to repro

micha15:04:34

the heisenbugs are from undisciplined mutation

micha15:04:43

javelin eliminates that

micha15:04:44

the tradeoff there is that your components get a lot more complex when you have the one atom

micha15:04:56

because you can't break the problem down and use scopes to manage it

micha15:04:16

like why don't we make all applications with just one atom containing the whole state?

dm315:04:52

I understand the tradeoff simple_smile why reinvent namespaces

micha15:04:57

so i think they're causing the bugs that they're only able to track down by replaying

micha15:04:18

if they didn't have the one atom they wouldn't need to replay to repro

micha15:04:40

i found that to be the case with things like the component stuff in clojure

micha15:04:53

it's impossible to reason about the huge blob of map data

micha15:04:59

and how it got into a weird state

micha15:04:10

because there is no encapsualtion of state there

l1sp3r15:04:14

Thanks guys been reading responses, v helpful

micha15:04:03

do you think we need a travis badge on the github page?

micha15:04:17

for me it's useful to see if tests pass for PRs and stuff

micha15:04:43

but i imagine people would not be using master, they'd be using a release version

micha15:04:00

so the badge seems redundant

piotrek19:04:13

I have a following issue with hoplon and semantic-ui mix

piotrek19:04:51

With hoplon, when I click in the dropdown field I am getting an error in JS console:

semantic.inc.js:18207 Transition: Element is no longer attached to DOM. Unable to animate. slide down in <div class="menu" tabindex="-1">…</div>module.error @ semantic.inc.js:18207module.animate @ semantic.inc.js:17527module.initialize @ semantic.inc.js:17425(anonymous function) @ semantic.inc.js:18322jQuery.extend.each @ jquery.inc.js:648jQuery.fn.jQuery.each @ jquery.inc.js:270$.fn.transition @ semantic.inc.js:17373module.animate.show @ semantic.inc.js:7050module.show @ semantic.inc.js:4536module.event.search.focus @ semantic.inc.js:4966jQuery.event.dispatch @ jquery.inc.js:3074elemData.handle @ jquery.inc.js:2750jQuery.event.trigger @ jquery.inc.js:2986jQuery.event.simulate @ jquery.inc.js:3301handler @ jquery.inc.js:3552
reload.cljs:63 Reload

piotrek19:04:16

I can see the mentioned element in the DOM tree in dev tools

piotrek19:04:46

but I suspect that hoplon might be removing and adding again some elements when it detects that semantic ui is changing the DOM

dm319:04:51

@piotrek: I think you had the same exact issue last time, no? When you added a span somewhere in the autocomplete and the issue went away?

dm319:04:27

have you tried with latest Hoplon built from master btw?

piotrek19:04:32

yeah, but then I was using a static list of options and a workaround was to create a dummy element inside a div

piotrek19:04:44

but with a remote content loading I have to use a select element

piotrek19:04:49

and the workaround no longer works

piotrek19:04:03

so I wanted to find a fix for a root cause simple_smile

piotrek19:04:09

@dm3 you have a great memory simple_smile

dm319:04:33

it seems I do simple_smile

piotrek19:04:34

I will try to get dropdown with div instead of select working but I would like to fix the problem anyway and don’t use workarounds

dm319:04:36

I'm afraid you'll have to debug which element that is that gets detached (or never attached in the first place)

dm319:04:09

try with latest master as an interaction with jQuery.remove was fixed there that caused issues

piotrek19:04:30

thanks for a hint - I will try the latest version

piotrek19:04:48

it seems that I should get the div version working too so a workaround might work

dm319:04:02

also I'd add the element to a div inside body as I think body gets some special treatment in Hoplon and might have more bugs. I might be completely wrong though.

piotrek19:04:34

will try that too

micha20:04:34

i think the jquery .remove() thing might be happening here?

micha20:04:41

we did fix that in the latest master

dm320:04:17

@micha - I was wondering if you have thought about/worked with Elm (or another library using Applicative FRP instead of Monadic FRP implemented in Javelin). It seems like it also allows for clean abstraction of functionality in modules. The biggest theoretical difference is that with Applicative FRP you're forced to declare all your inputs beforehand, while in Flapjax/Javelin they can be created on the fly. However, in real Hoplon applications the graph is pretty static too (if you consider things like loop-tpl just reusing a "template" of a subgraph)

micha20:04:11

@dm3: we went crazy with that stuff before we settled on javelin, yeah

raywillig20:04:36

hey this might be off topic as it’s probably more of a cljs question, but since it’s a hoplon app i’m working in i’m just going to ask it here: is it possible to use multimethods where the defmulti is defined in one namespace and defmethods can be defined in one or more other namespaces?

dm320:04:06

@raywillig: sure, you just need to require the namespaces

raywillig20:04:00

so in the third namespace where I want to use the defmethods, i have to require both the namespace with the defmulti and the one(s) with the defmethods I want to use?

raywillig20:04:17

but I also have to :refer the functions I want to use, right?

dm320:04:36

you don't have to refer anything, it's just for convenience

micha20:04:01

so like with hoplon.core/do! for example

micha20:04:08

that's a multimethod defined in hoplon.core

micha20:04:31

suppose there are defmethod calls that edfine dispatches for that multimethod in some other namespace

micha20:04:34

like foo.bar

micha20:04:00

and now suppose you have a 3rd namespace my.ns where you want to use the do! multimethod

micha20:04:29

in my.ns you need to require hoplon.core for sure, so you can use the hoplon.core/do! name

micha20:04:48

you also need to require foo.bar if you want those dispatches to be installed

micha20:04:56

because they get installed when that namespace is compiled

micha20:04:05

and it gets compiled the first time something requires it

micha20:04:22

if something else already required it then you're ok and you don't strictly need to require it again

raywillig20:04:11

ok, cool, i think i get it

micha20:04:26

defmethod mutates the multimethod

micha20:04:45

but it can only mutate it if you evaluate the defmethod expression

micha20:04:01

the only way you can evaluate expressions is to require the namespace at some point

micha20:04:55

@dm3: what do you think about "classical" FRP vs javelin

dm320:04:49

it seems like the way Javelin expresses signals is best suited for a kinda-mutable environment of Clojurescript

dm320:04:30

I have read some of Elm's thesis but can't recall much

dm320:04:58

I think he went for more static/correctness guarantees with the Applicative approach

dm320:04:36

which eliminates some of the problems with unbounded accumulation of events

micha20:04:14

i remember seeing some pretty serious flaws in the type stuff in elm

micha20:04:35

i mean typesafe javascript is nonsense i'm pretty sure

micha20:04:58

unless you're content to run your own vm or something

dm320:04:19

well, I think it can work if you develop in your safe little world and sanitize anything that goes outside

dm320:04:08

I've opened the thesis again and can see that he mentions Flapjax favourably on the accounts that are signifcant when comparing Elm to other FRP frameworks: 1. elimination of space leaks through not being lazy 2. light conceptual load through not mentioning the monadic machinery

micha20:04:42

the way you need to interop with javascript though in elm

micha20:04:52

is basically crippled by the type business

micha20:04:08

and javascirpt interop is the name of the game in the real world

micha20:04:19

like guile scheme vs clojure

dm320:04:44

yep, I guess that's why we program in Clojure/script and not Scala here simple_smile

dm320:04:50

so we'll agree on that

dm320:04:22

as you can imagine the guys in #scalarians Slack would find a 101 argument to disagree

micha20:04:04

or the haskelloids

micha20:04:35

but i mean the fact that elm does interop by adding runtime assertions

micha20:04:40

as i understand it

micha20:04:46

that's the worst of all worlds

micha20:04:57

like you have runtime enforcement of type stuff

micha20:04:06

which means lots of NPE type nonsense now

micha20:04:24

plus the crippling of the type system when you're designing your abstractions too

dm320:04:26

oh man, how I can see some people having a red face and gasping for air after you've said that

dm320:04:59

some people maintain a view that you can't even have an abstraction without the types

dm320:04:16

and I understand them theoretically

dm320:04:41

but practice of web dev is so far removed from theory, for better or worse

l1sp3r20:04:46

I looked at elm

l1sp3r20:04:29

To be honest it's pretty elegant, was put off by the complexity of go using an element

l1sp3r20:04:10

Sorry autocorrect - complexity of focusing an element

l1sp3r20:04:38

Something which should be trivial became complex, sure they'll get it fixed in time

piotrek20:04:45

@dm3 @micha updating to the master version fixed my problem - thanks!

piotrek20:04:53

when will the new version be released?

micha20:04:33

@piotrek: in the next few days, hopefully!

micha20:04:51

yeah i guess i've never seen the joy of type systems

dm320:04:53

regarding types: https://dl.dropboxusercontent.com/u/7810909/talks/parametricity/4985cb8e6d8d9a24e32d98204526c8e3b9319e33/parametricity.pdf I kind of agree with the material, but on the other hand I have the experience and joy of working with Clojure and the painful experiences of designing abstractions in Scala. I guess I'm just not smart/interested/motivated enough...

micha20:04:31

i've never seen the benefit of having an opinionated compiler

micha20:04:48

my code doesn't have any more bugs than average

dm320:04:02

the above mostly expands on the "Free Theorems" ideas by Wadler

micha20:04:15

when i see haskell programmers making finance applications without unit or integration tests then i'll be convinced

l1sp3r20:04:02

I've used Scala and Clojure extensively in financial services

micha20:04:37

which has more unit tests? just curious

micha20:04:04

i hope i'm not coming off as being argumentative, it's not my intention at all

l1sp3r20:04:16

No that's fine

l1sp3r20:04:24

I have no agenda

micha20:04:35

neither do i

l1sp3r20:04:06

It was interesting, was more about the previous Dev experience of the team than the language

l1sp3r20:04:36

On one team which was using scala, turned me against TDD

l1sp3r20:04:04

Massive amounts of complexity leaked through to make things 'testable'

micha20:04:32

i am interested in like how many tests are needed to be confident of correctness

l1sp3r20:04:50

Locals clearing makes a huge impact on how you write code also

micha20:04:59

my experience is that clojure programs have the same number of tests more or less

micha20:04:04

as typed languages

micha20:04:24

this indicates to me that the compiler isn't testing the right thing at all

l1sp3r20:04:25

I used generative testing on one clojure project. That was v useful

micha20:04:37

yeah that's the caddillac of testing for sure

l1sp3r20:04:13

I wouldn't use scala as a poster child for statically typed languages though

micha20:04:25

yeah it's insane simple_smile

micha20:04:34

i was thinking haskell

l1sp3r20:04:40

Haskell is much cleaner

micha20:04:40

a very sane language

dm320:04:47

and it's more powerful in a typed language like Haskell, actually. If you have a properly typed abstraction, and you come up with good properties - you have a very good chance of the implementation being correct

dm320:04:15

it's just that the barrier to entry is so damn high

l1sp3r20:04:25

Things like heterogeneous maps are v cool

micha20:04:41

i still think that if this were the case you would see a big difference between the number of tests in real demanding applications between haskell and clojure

micha20:04:55

you would need far fewer tests in haskell

micha20:04:02

but i don't thnk this is actually the case

dm320:04:07

maybe there is

dm320:04:26

there's Jane Street running on OCaml

l1sp3r20:04:29

Well if we're talking typed languages, how about Idris ?

dm320:04:50

don't think anyone is writing business-related apps in Idris

l1sp3r20:04:06

Maybe the issue isn't that type systems aren't helpful, maybe it's that they're not good enough yet

micha20:04:12

the fundamental flaw that i see is that the compiler is essentially trying to run the program without running the program

micha20:04:26

the type system comprises a sort of shadow evaluator

micha20:04:36

this seems highly suspect

dm320:04:39

with dependent types the difference between the compiler and the program is even less apparent

micha20:04:51

and the more complex the type system is, the more of a lisp it becomes

dm320:04:01

even GHC with proper extensions has a Turing-complete type system

l1sp3r20:04:05

Yes I do see a convergence

micha20:04:09

until it becomes itself turing complete and the halting problem applies to it

l1sp3r20:04:27

I think halting problem is overrated

l1sp3r20:04:01

Issue is we don't designed systems where computation can be interrupted correctly

dm320:04:31

there are so many ways to build functioning software

dm320:04:36

depending on what you optimize for

dm320:04:59

in the end it all depends on individual ability/strategy

micha20:04:23

for me expressive power beats type systems by a large margin, because more powerful abstractions can give the human the power to see if it's correct or not

micha20:04:45

if you can't tell if your program is correct, in lisp you have so much power to refactor so it's clear

dm320:04:01

well, I think you can have abstractions in Haskell as expressive as the ones in Clojure

l1sp3r20:04:12

One thing Haskell gets right is its emphasis on immutability

dm320:04:13

more so, depending on how you define "expressiveness"

dm320:04:32

but the barrier to understanding the abstractions is much lower in Clojure

micha20:04:32

well like hoplon would be difficult or impossible to do in haskell i think

l1sp3r20:04:54

Does hoplon have its own compiler?

micha20:04:02

no it's just a cljs library

micha20:04:15

there is a hoplon compiler, but that's just to emit some cljs

micha20:04:29

to work around some of the design decisions of the cljs compiler

l1sp3r20:04:37

Interesting

micha20:04:13

the only thing the hoplon compiler does is generate the html boilerplate and to refer the hoplon core vars into your namespaces so you don't have to namespace qualify them

micha20:04:34

because of the way the cljs compiler works you can't do :refer :all in a cljs namespace

micha20:04:49

so you'd end up with like (hoplon/div ...) all over the place

micha20:04:54

which is not cool simple_smile

l1sp3r20:04:23

Is the clojure script compiler online yet?

micha20:04:36

yesh it's self hosted, is that what you mean?

l1sp3r20:04:54

Eg I'd like to be able to call: (compile-to-js f)

l1sp3r20:04:04

From my clojure code

micha20:04:06

yeah so yes and no

l1sp3r20:04:15

Where f is just a function pointer

l1sp3r20:04:27

I don't ask for a lot do I

micha20:04:41

you can call the clojurescript compiler from a clojure program and generate javascript

micha20:04:55

but for a real application you will want to optimize that

l1sp3r21:04:02

No I don't

micha21:04:08

yeah you don't have to

l1sp3r21:04:21

My domain is apps over a LAN

l1sp3r21:04:42

Minification is totally unnecessary

micha21:04:56

yeah i mean the google compiler also does performance optimizations

micha21:04:04

keyhole optimizations of various kinds

micha21:04:18

but that might not be a big deal for your use

l1sp3r21:04:26

Yeah for me that's needless optimisation which complicates the build chain

micha21:04:35

yeah you dont need it

micha21:04:57

one thing you might want is to use the self-hosted cljs compiler

micha21:04:08

then you have the normal lisp eval and whatnot

micha21:04:17

maybe you compile the program in the client even

micha21:04:52

alan made a sort of jsfiddle thing for hoplon the other day

l1sp3r21:04:01

Interesting

micha21:04:04

like for people to try it out in a webpage

l1sp3r21:04:30

So here's my domain

l1sp3r21:04:01

I want to build a spreadsheet notebook style interface for financial companies

l1sp3r21:04:18

There's a language behind it

l1sp3r21:04:26

DSL if you will

l1sp3r21:04:44

Looking at nicking the syntax from R

l1sp3r21:04:18

Ideally the user can write a render function for some data type

l1sp3r21:04:54

That'll get transpiled on the server and send back down to client dynamically

dm321:04:19

hehe, I have a vaguely similar application that I'm working on

l1sp3r21:04:29

Interesting..

l1sp3r21:04:40

Where u based?

dm321:04:45

Switzerland

l1sp3r21:04:51

V interesting

l1sp3r21:04:55

I'm in London

dm321:04:15

nearby, Zug

l1sp3r21:04:25

V cool, would be interested in what your doing. Maybe compare notes

l1sp3r21:04:57

Got this crazy idea to build a prototype and start a business

l1sp3r21:04:35

But from spending 15 years working in financial services know there's a desperate need for a product like this

dm321:04:31

the spreadsheet seems to be the ultimate form. I think folks at OpenGamma have realised that, for example

dm321:04:42

they're building integrations into Excel

micha21:04:05

spreadsheet is the optimal computer interface imo

l1sp3r21:04:34

Think there's a lot more that can be applied

l1sp3r21:04:00

Been think very hard about how you adapt spreadsheet interface to report interface

l1sp3r21:04:17

Which can deal with varying size tables etc

l1sp3r21:04:38

Also about code promotion and versioning

micha21:04:35

this is pretty much exactly the goal of hoplon

l1sp3r21:04:05

I have to get some sleep, but if you want to discuss further drop me a line at: <mailto:[email protected]|[email protected]>

l1sp3r21:04:58

Thanks for talking, been a fun discussion, first of many I hope

micha21:04:11

@dm3: have you seen Backus' FL language?

micha21:04:37

@l1sp3r: you are always welcome simple_smile

l1sp3r21:04:10

I'll be back :)

dm321:04:25

nope, I haven't

dm321:04:45

yep, a good discussion simple_smile

dm321:04:50

I also have to get some sleep

micha21:04:37

that's like a 3rd form of functional programming

micha21:04:08

with i think the same potential for type-safeness

micha21:04:14

but without the type system