File Structure
Each csv++ source code file contains two distinct parts: an optional code section and a CSV section.
Code Section
The code section is where variables and functions can be defined and subsequently used in the CSV
section. It is terminated by the ---
separator and anything following that will be treated as the
CSV section.
Functions
Functions basically act as macros, where variables are interpolated but they are otherwise inserted into the spreadsheet without being evaluated. The language is a superset of the formula language used in spreadsheets - you should be able to do everything you can in a spreadsheet but also define functions and variables.
Functions are defined by:
fn <function-name> ( <arg1>, <arg2>, ... )
They can have any number of arguments and will be evaluated in the context of the cell in which they are called.
Examples
fn fees(quantity)
quantity * 0.10
fn profit(price, quantity)
(price * quantity) - fees(quantity)
---
Variables
Variables can be defined in the code section by giving a name (a combination of letters, numbers
and underscores), the expression :=
and followed with a value:
<variable-name> := <expression>
To reference a variable you just use it by it's name - there is no special operator to dereference.
Examples
foo := 42
bar := foo * 2
---
=foo,=bar,
will evaluate to:
=42,=(42 * 2),
Cell References
You can use A1-style cell references in the code section and within function definitions. Since the
syntax for variable references and for cell references are overlapping (for example ABC
is both a
valid cell reference and variable reference), csv++ will only interpolate the variable if it is
defined. Otherwise it will be left alone and treated as a cell reference.
CSV Section
The CSV section defines the stucture of your spreadsheet and makes use of the functions and variables defined above.
Variables
An important feature of the CSV section is being able to assign variables to cells and reference
them elsewhere. You do this using the [[var=<var-name>]]
syntax:
profit := income - fee
---
[[var=fee]], [[var=income]], =profit,
which will evaluate to:
,,=(B1 - A1)
Row Variables
You can also assign a variable to reference an entire row using the row option syntax (![[
/]]
):
![[var=row_1]],,,
Fills
A common feature of spreadsheets is to drag the bottom right corner and that formula will be applied
over a range of rows. The ![[fill=<number-of-rows>]]
provides similar functionality.
![[fill=3]]foo,bar,baz,
evaluates to:
foo,bar,baz,
foo,bar,baz,
foo,bar,baz,
which is not very helpful but becomes interesting when you combine it with variables.
# fees are a fixed $2.00 per trade
fees := 2
fn profit(quantity, price_each)
(price_each * quantity) - fees
---
![[fill=3]][[var=number_of_shares]], [[var=price]], "=profit(number_of_shares, price)",
becomes:
,,"=(B1 * A1) - 2",
,,"=(B2 * A2) - 2",
,,"=(B3 * A3) - 2",
A full list of cell & row options will be discussed in the Cell & Row Options section.
Comments
Any line in the CSV section will be treated as a comment and ignored if it starts with a #
:
foo,bar,baz,
# this is a comment
foo1,bar1,baz1,
Multi-line Cells
When using lots of cell options the lines can get pretty long. To help with this you can split a
single spreadsheet row over multiple lines using the \\
syntax like so:
---
![[halign=center \
valign=top \
text=bold \
text=underline \
]] This, Is, A, Header, Row,
[[var=one]] , \
[[var=two]] , \
[[var=three]] , \
[[var=four]] ,
which is equivalent to:
---
![[halign=center valign=top text=bold text=underline]] This, Is, A, Header, Row,
[[var=one]] , [[var=two]] , [[var=three]] , [[var=four]] ,