Reporting system - declarative
Hendrik Boom
hendrik at topoi.pooq.com
Wed Nov 16 09:27:02 EST 2011
On Sat, 09 Jul 2011 18:05:48 -0400, Yawar Amin wrote:
> Hi John,
>
> On 2011-07-08, at 23:33, John Ralls wrote:
>
>>> […]
>>
>> Fun. Two questions: Can that be easily converted into a string parser
>> so that normal users aren't put off by the extra parentheses,
>
> I guess we could replace all the parens with more HTML-reminiscent
> characters like << and >>, so you’d get stuff like (btw I’m using dots
> to represent spaces everywhere as my MUA is eating up the first blank
> space on every line):
>
> <<report ...
> ..<<defs
> ....<<def-date ...>>
> ....<<def-date ...>>
> ..>>
>>>
>>>
> then do a search-and-replace to turn that back into Scheme. We might
> overcome a lot of phobia if we hide the fact that we’re really making
> them write Scheme :-)
There's also the use of [ ] in the old much-forgotten Lisp 1.5
metalanguage -- using foo[a, b, c] instead of (foo a b c). Perhaps foo[a
b c] would suffice. And C uses context-prefixed curly brackets, as in do
{ ... } and else{ ... }.
>
> Another thing we could recommend is lining up the parens below the
> function names on multi-line function calls. I mean:
>
> (report ...
> ..(defs
> ....(def-date ...)
> ....(def-date ...)
> ..)
> )
>
> In the beginning I found it a lot more digestible when I didn’t have to
> deal with the mess of ‘)))))))’.
I still find your layout more digestible, after years or using Scheme-
related languages. I prefer it in C with its curly brackets, too.
Now the parentheses in List are a syntactic price that's paid to make the
metaprogramming aspects more modular. There's no question of what can
fit within what, as there would be with independent pieces of context-
free grammar. I consider uniform means of reducing the parentheses
problem a boon.
In my own Lisp dialect I used an additional convention: '/' in a list
signals the start of a sublist as its last element; thus ( a / b ) is
equivalent to ( a ( bb )), and ( a / b / c ) equivalent to ( a ( b ( c
))). This eliminated most of the closer-clusters. It ended up having a
role similar to the that of ';' in other programming languages.
Unfortunately, '/' and ';' now have other, incompatible meanings in
Scheme.
But most Scheme programmers object to any suggestion that brackets are a
problem for Real Programmers, as if methods of dealing with parentheses
attack their virility or something like that
I just think programs should be written in a manner that makes them as
clear as possible. Programming is hard enough without unnecessary
obfuscation.
>
>> and is there anything about that that works in Scheme but not in C?
>
> I really, really don’t want to deal with memory management….
>
> Anyway, I kind of mercilessly hacked the ‘Hello, World’ report that
> comes with GC, in
> share/gnucash/guile-modules/gnucash/report/hello-world.scm, and wrote a
> few functions which do what I was talking about. So now I’m able to say:
>
> (d:report
> "income-statement" ; name
> 0 ; defs
> ; Have to keep this title while experimenting in the sample report that
> ; comes with GnuCash
> "Hello, World" ; title
> "2011-01-01 to 2011-07-31" ; subtitle (d:filter-none ; body
Is there a missing line break in this line?
> (d:p "Some text.”)
> (d:p "A little more text.")))
>
> … and that generates the report that you’d expect. The ‘d:’
> (‘declarative’) prefix is just to make sure I don’t clash with anything.
> Code is up on https://github.com/yawaramin/gc-decl-reports (I'm not
> pushing anything which causes a crash for me, so it should be reasonably
> safe. But caveat emptor).
>
> Regards,
>
> Yawar
>
> _______________________________________________ gnucash-devel mailing
> list
> gnucash-devel at gnucash.org
> https://lists.gnucash.org/mailman/listinfo/gnucash-devel
More information about the gnucash-devel
mailing list