Formulas calculate numbers. They can include standard math operators like `+`

, `-`

, `*`

, and `/`

, more advanced stuff like `pow`

, `sin`

, and `round`

, and most importantly they can reference the value of specific Beans and other Formulas. The full list of operations can be found below.

To create a Formula simply include the following format in your note:

`$$(<FORMULA_NAME>)<FORMULA-BODY>`

The **Formula Name** portion must conform to the Name Portion rules. The **Formula Body** uses S-expression notation with the operator in the first position and the parameters listed after i.e. `(+ 1 1)`

.

Parameters can be other S-expressions i.e. `(+ 1 (/ 100 10))`

or they can be numbers.

Formulas can also reference other Formulas by name. To include one formula in another use the `$`

operator followed by the Formula name i.e. `(* -1 ($ another-formula))`

. Formulas do not allow recursion for now.

## Body Syntax

As stated above, the body portion of a Formula uses S-expressions to denote the Formula procedure. This format can be a little odd at first glance, but it allows all operations to have a similar format, which is useful – there is only one format to learn.

The format for an S-expression is as follows

`(operator parameter parameter...)`

The operator can be any of the operators listed below. The parameters are usually numbers, but in some cases require special values outlined by their corresponding operators below.

## Operators

### +

`(+ x y)`

Add two numbers together, use sum to add a list of numbers.

### -

`(- x y)`

Subtract `y`

from `x`

.

***

*(** x y)

Multiply two numbers.

### /

`(/ x y)`

Divide `x`

by `y`

.

## /tap Specific Operators

All of the three Bean operators function the same way except `BEAN`

returns the net value of the Bean, `BEAN-`

returns the outgoing value of the Bean and `BEAN+`

returns the incoming value of the Bean.

The `name`

parameter is required. `folder`

, `tags`

and `date`

are optional, and, if used, must be surrounded by double quotes. If you wish to select a Bean value by date, but not Folder or Tags put a `-`

in place of the unwanted parameter i.e. `(BEAN budget - - "2022")`

. Any of the optional parameters can be ignored by using the `-`

character.

**A few notes on the Tags parameter: **

- To specify a list of Tags separate the individual Tags with spaces i.e.
`"very special stuff"`

- The
`#`

character is optional`"#very #special #stuff"`

is functionally equivalent to the above. - To include a tag whose name is itself quoted i.e.
`#"Quoted Tag"`

simply use a`\`

character to escape the nested quotes i.e.`"#\"Quoted Tag\""`

### BEAN

`(BEAN name folder tags date)`

Returns the net value of the specified Bean `name`

filtered to the `folder`

, `tags`

and `date`

parameters.

### BEAN+

`(BEAN+ name folder tags date)`

Returns the incoming value of the specified Bean `name`

filtered to the `folder`

, `tags`

and `date`

parameters.

### BEAN-

`(BEAN- name folder tags date)`

Returns the outgoing value of the specified Bean `name`

filtered to the `folder`

, `tags`

and `date`

parameters.

### $

`($ name)`

Include the computed value of a Formula with the specified `name`

.

## More Math Operators

### %

`(% x y)`

`x`

mod `y`

### min

`(min x [y ...])`

Takes an arbitrary number of parameters and returns the least number.

### max

`(max x [y ...])`

Takes an arbitrary number of parameters and returns the greatest number.

### sum

`(sum x [y ...])`

Adds a list of parameters

### round

`(round x)`

Round decimal to nearest integer value.

### floor

`(floor x)`

Returns the greatest integer less or equal than the input `x`

### ceil

`(ceil x)`

Returns the least integer greater than or equal the input `x`

### pow

`(pow base exponent)`

Computes the power of a number `base`

to the `exponent`

### cos

`(cos x)`

Computes cosine of `x`

### sin

`(sin x)`

Computes sine of `x`

### tan

`(tan x)`

Computes tangent of `x`