Re: Literate programming with calc (help)

2023-09-10 Thread Ypo
I have discovered, taking a look at the Org Manual, that exists an 
embedded mode for Calc.


https://www.gnu.org/software/emacs/manual/html_mono/calc.html#Assignments-in-Embedded-Mode

Using "C-x * e" it solves this kind of formula with units:

a := 3 m / s

t := 7 s

a t =>




> From:     Ihor Radchenko
> Subject:     Re: LIterate programming with calc (help)
> Date:     Tue, 01 Nov 2022 07:22:18 +


"Fraga, Eric"  writes:

>/> I guess that the main problem is that calc is tightly integrated with/
>/> interactive commands. Maybe ob-calc could be extended to somehow/
>/> indicate the commands to be executed in addition to inputting stack/
>/> entries./
>/>/
>/> Not sure if there is much interest in such feature though./
>//
>/Thinking out loud, what would be better, but I have no idea how feasible/
>/it would be, would be to have ob-calc make use of the embedded calc/
>/functionality and syntax, so that you could write something like this:/
>//
>/#+begin_src calc/
>/a := 300 m/
>/b := 2 a =>/
>/#+end_src/
>//
>/which would output the result of any line with => on it./

I am CCing Tom Gillespie, the maintainer of ob-calc. Maybe he has
something to say.

--
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>










Re: LIterate programming with calc (help)

2022-11-26 Thread Ypo
Just in case you find this package interesting. Except some problems 
with units conversion, it's nice:


https://github.com/sulami/literate-calc-mode.el


This is a literate calc file.

Lines without "=" are ignored.

All results starting with "=>" are an overlay generated by
literate-calc-mode. That means they are displayed in Emacs, but not
actually in the buffer/file contents.

We can calculate a value like so:

= 2 + 2 => 4

If there is any string on the left hand side, it becomes a bound
variable.

Pi = 3.14159 => Pi: 3.14159

We can use this variable below the definiton.

Tau = Pi * 2 => Tau: 6.28318

Results are calculated using Emacs' own calc, so you can use formulas
as well.

= round(Pi, 2) => 3.14

Later bindings shadow earlier ones:

Pi = 3 => Pi: 3

= Pi => 3

Variable names can have spaces as well:

Monthly Expenses = 500 => Monthly Expenses: 500

Monthly Income = 1000 => Monthly Income: 1000

Annual Savings = 12 * (Monthly Income - Monthly Expenses) => Annual Savings: 
6000

All values are recalculated on every update in a spreadsheet-like
fashion.

Calc also has a lot of advanced features, like arrays:

Numbers = [1 2 3] => Numbers: [1, 2, 3]

= 3 Numbers => [3, 6, 9]




"Fraga, Eric"  writes:

>/> I guess that the main problem is that calc is tightly integrated with/
>/> interactive commands. Maybe ob-calc could be extended to somehow/
>/> indicate the commands to be executed in addition to inputting stack/
>/> entries./
>/>/
>/> Not sure if there is much interest in such feature though./
>
>/Thinking out loud, what would be better, but I have no idea how feasible/
>/it would be, would be to have ob-calc make use of the embedded calc/
>/functionality and syntax, so that you could write something like this:/
>
>/#+begin_src calc/
>/a := 300 m/
>/b := 2 a =>/
>/#+end_src/
>
>/which would output the result of any line with => on it./

I am CCing Tom Gillespie, the maintainer of ob-calc. Maybe he has
something to say.


Re: LIterate programming with calc (help)

2022-11-01 Thread Ihor Radchenko
"Fraga, Eric"  writes:

>> I guess that the main problem is that calc is tightly integrated with
>> interactive commands. Maybe ob-calc could be extended to somehow
>> indicate the commands to be executed in addition to inputting stack
>> entries.
>>
>> Not sure if there is much interest in such feature though.
>
> Thinking out loud, what would be better, but I have no idea how feasible
> it would be, would be to have ob-calc make use of the embedded calc
> functionality and syntax, so that you could write something like this:
>
> #+begin_src calc
> a := 300 m
> b := 2 a =>
> #+end_src
>
> which would output the result of any line with => on it.

I am CCing Tom Gillespie, the maintainer of ob-calc. Maybe he has
something to say.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at .
Support Org development at ,
or support my work at 



Re: LIterate programming with calc (help)

2022-10-31 Thread Fraga, Eric
On Monday, 31 Oct 2022 at 09:23, Ihor Radchenko wrote:
> I looked into ob-calc and it looks like the way to define variables is
> via :var header argument.

Indeed.  Something like :var a="300 m" does work.

> I guess that the main problem is that calc is tightly integrated with
> interactive commands. Maybe ob-calc could be extended to somehow
> indicate the commands to be executed in addition to inputting stack
> entries.
>
> Not sure if there is much interest in such feature though.

Thinking out loud, what would be better, but I have no idea how feasible
it would be, would be to have ob-calc make use of the embedded calc
functionality and syntax, so that you could write something like this:

#+begin_src calc
a := 300 m
b := 2 a =>
#+end_src

which would output the result of any line with => on it.

-- 
: Eric S Fraga, with org release_9.5.5-1028-gcd835d in Emacs 29.0.50


Re: LIterate programming with calc (help)

2022-10-31 Thread Ihor Radchenko
Ypo  writes:

> Would it be something like this?
>
> #+begin_src calc
>    a = 300 m
>    b = 300 m
>    Area = a*b
>    cost = 1 ($/m^2)
>    A*c
>
> #+end_src

I looked into ob-calc and it looks like the way to define variables is
via :var header argument.

Other than that, ob-calc simply does what calc would do if you type the
above into calc stack. Which would also yield nothing.

I guess that the main problem is that calc is tightly integrated with
interactive commands. Maybe ob-calc could be extended to somehow
indicate the commands to be executed in addition to inputting stack
entries.

Not sure if there is much interest in such feature though.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at .
Support Org development at ,
or support my work at 



Re: LIterate programming with calc (help)

2022-10-24 Thread Fraga, Eric
On Monday, 24 Oct 2022 at 13:26, Ypo wrote:
> Why do you think it doesn't work something more human readable like this?
>
> #+begin_src calc
>solve([
>a = 300 m,
>b = 300 m,
>Area = a*b,
>cost = 1 (USD/m^2),
>z = Area*cost
>
>], [a, b, Area, cost, z])
> #+end_src

It only parses a line at a line unfortunately.  This would work in
Maxima, mind you. ;-)  (with some minor change in syntax, of course)

-- 
: Eric S Fraga, with org release_9.5.5-966-g88c85d in Emacs 29.0.50


Re: LIterate programming with calc (help)

2022-10-24 Thread Ypo

Not bad, thanks!!!

Why do you think it doesn't work something more human readable like this?

#+begin_src calc
   solve([
   a = 300 m,
   b = 300 m,
   Area = a*b,
   cost = 1 (USD/m^2),
   z = Area*cost

   ], [a, b, Area, cost, z])
#+end_src


Best regards


El 24/10/2022 a las 9:56, Fraga, Eric escribió:

On Sunday, 23 Oct 2022 at 14:15, Ypo wrote:

Is it possible to express in a calc block some basic operations with
variables and non-predefined units?
Why A*c won't show an arithmetic result, but ~: A c ~?

I've never managed to get calc blocks define variables.  The equations
you have typed in are "equations" in the mathematical sense, not
assignment statements.


Is it possible to work with the "$" unit?

$ means something specific in calc (cannot remember what).  I use "USD"
instead, for instance, and it works fine.

The following single line calc block does do what you want:

#+begin_src calc
   solve([a = 300 m, b = 300 m, Area = a*b, cost = 1 (USD/m^2), z = Area*cost], 
[a, b, Area, cost, z])
#+end_src

#+results:
: [a = 300 m, b = 300 m, Area = 9 m^2, cost = USD / m^2, z = 9 USD]


Re: LIterate programming with calc (help)

2022-10-24 Thread Christian Moe


Fraga, Eric writes:

> On Monday, 24 Oct 2022 at 09:20, Ihor Radchenko wrote:
>> I vaguely recall that storing variables in calc is something like
>> variable := assignment (which is actually rewrite rule, but that's how
>> 13.1 Storing Variables section of the calc manual explains variable
>> assignments).
>
> That is true for embedded calc (which I use all the time) but I cannot
> seem to get this to work for src blocks:


Same: it requires using the `s s' (calc-store) command, though (which
can also be done without the := assignment operator), and I've searched
the manual without spotting a way to do that with algebraic entry and
hence in a src block, as there doesn't seem to be any corresponding
command. I hope there is a way, though!

As an unsatisfying workaround, one could use :var header arguments; they
work up to a point, but not with units, as Ypo wants to use (and which
are are a really cool thing about Calc).

Once one's using variables, it will probably be necessary to wrap the
final calculation in evalv() to get a numeric value as output instead of
a formula with the variable names in it.

Another obstacle to what Ypo is trying to do is the attempt to use the $
sign for the currency unit. Calc does not have pre-defined currency
units, and $ is taken - it refers to the last value on stack. I tend to
use 'USD'.

So a partial, if pointless, way to do this would be to first store the
variables with the calculator:

  ' 300 m
s s a   # store a = 300 m
  ' 300 m
s s b   # store b = 300 m
  ' 1 USD/m^2
s s cost# store cost = (1) usd/m^2
  ' a*b
s s Area# store Area = a*b (*not* 9 m^2)

Then the last step could be done in a src block:

  #+begin_src calc
evalv(Area * cost)
  #+end_src

  #+RESULTS:
  : 9 USD

(Another cool bit: If you change the value of a or b and rerun the src
block, the result will change, since what was stored in Area was the
product of the variables, not the product of their values.)

Yours,
Christian



Re: LIterate programming with calc (help)

2022-10-24 Thread Ihor Radchenko
"Fraga, Eric"  writes:

> On Sunday, 23 Oct 2022 at 14:15, Ypo wrote:
>> Is it possible to express in a calc block some basic operations with
>> variables and non-predefined units?
>
>> Why A*c won't show an arithmetic result, but ~: A c ~?
>
> I've never managed to get calc blocks define variables.  The equations
> you have typed in are "equations" in the mathematical sense, not
> assignment statements.

I vaguely recall that storing variables in calc is something like
variable := assignment (which is actually rewrite rule, but that's how
13.1 Storing Variables section of the calc manual explains variable
assignments).

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at .
Support Org development at ,
or support my work at 



Re: LIterate programming with calc (help)

2022-10-24 Thread Fraga, Eric
On Monday, 24 Oct 2022 at 09:20, Ihor Radchenko wrote:
> I vaguely recall that storing variables in calc is something like
> variable := assignment (which is actually rewrite rule, but that's how
> 13.1 Storing Variables section of the calc manual explains variable
> assignments).

That is true for embedded calc (which I use all the time) but I cannot
seem to get this to work for src blocks:

#+begin_src calc
  a := 300 m
  2 a
#+end_src

#+results:
: 2 a

whereas embedded mode works fine:

a := 300 m

and

2 a => 600 m

I really do not understand how calc src blocks work (I've not looked at
the code, mind you).

-- 
: Eric S Fraga, with org release_9.5.5-966-g88c85d in Emacs 29.0.50


Re: LIterate programming with calc (help)

2022-10-24 Thread Fraga, Eric
On Sunday, 23 Oct 2022 at 14:15, Ypo wrote:
> Is it possible to express in a calc block some basic operations with
> variables and non-predefined units?

> Why A*c won't show an arithmetic result, but ~: A c ~?

I've never managed to get calc blocks define variables.  The equations
you have typed in are "equations" in the mathematical sense, not
assignment statements.

> Is it possible to work with the "$" unit?

$ means something specific in calc (cannot remember what).  I use "USD"
instead, for instance, and it works fine.

The following single line calc block does do what you want:

#+begin_src calc
  solve([a = 300 m, b = 300 m, Area = a*b, cost = 1 (USD/m^2), z = Area*cost], 
[a, b, Area, cost, z])
#+end_src

#+results:
: [a = 300 m, b = 300 m, Area = 9 m^2, cost = USD / m^2, z = 9 USD]

-- 
: Eric S Fraga, with org release_9.5.5-966-g88c85d in Emacs 29.0.50