7 个不稳定版本 (3 个破坏性更改)
0.6.1 | 2024年2月13日 |
---|---|
0.6.0 | 2024年1月15日 |
0.5.1 | 2023年12月29日 |
0.4.1 | 2023年11月8日 |
0.3.0 | 2023年9月10日 |
#383 in 解析器实现
每月下载量 62 次
380KB
10K SLoC
csv++
csv++ 是 CSV 的超集,允许您在文本文件中编写电子表格,然后将其编译为目标电子表格(Excel、Google Sheets 或甚至回到 CSV)。
由于 csv++ 是 CSV 的超集,因此任何 CSV 文档都是有效的
Sum,Column 1,Column 2,
=5*SUM(B2,C2),,,
但是,您可以通过在顶部创建一个代码部分来提取可重用变量和函数,这部分与单元格隔开,使用 ---
。以下是一个相同的电子表格,但已提取为变量和函数
# you can define variables with `:=`
multiplier := 5
# functions look like this and have a single expression as their body
fn my_fn(a, b)
multiplier * SUM(a, b)
---
Sum , Column 1, Column 2,
"=my_fn(B2, C2)" , , ,
另一个有用的功能是将变量绑定到单元格。您可以在要绑定变量的单元格上使用 [[
/]]
语法。
fn my_complex_fn(a, b)
a * a + SQRT(b)
---
Complex function , Column 1 , Column 2 ,
"=my_complex_fn(a, b)", [[var=a]] , [[var=b]],
填充
另一个有用的功能是定义在编译的电子表格中填充的行范围(无限或有限)。要指定一个,请使用类似于上面的行选项语法,只需在其前面加上 !
: ![[
/]]
。
Product Name , Quantity , Price per Unit , =SUM(D2:D12)
![[fill=10]] , [[var=quantity]] , [[var=price]] , =quantity * price
这将获取第二行并在最终电子表格中重复 10 次。如果想要它一直重复到电子表格的末尾,只需省略 =10
并将其指定为 ![[fill]]
。
变量作用域
变量的作用域语义非常独特,因为每次函数调用都是相对于其使用的单元格进行评估的。如你所见,你可以使用 [[var=...]]
来将变量名绑定到指定的单元格。作为一个作用域语义的例子,我们将使用这个 csv++ 模板
foo_from_code_section := 42
---
[[var=bar_outside_fill]] , , , , ,
![[fill=2]]bar , [[var=bar_in_fill]] , =bar_in_fill , =bar_outside_fill , =foo_from_code_section,
它将编译为
, , , ,
bar , , =B2 , =A1 , =42
bar , , =B3 , =A1 , =42
分解如下
foo_from_code_section
- 不论在何处使用,总是42
。bar_in_fill
- 由于它在![[fill]]
内定义,它的值取决于最后一行,将是B2
或B3
。bar_outside_fill
- 总是A1
,指向其定义的单元格。由于它不在fill
内定义,所以没有相对性。
导入代码
csv++ 允许你使用 use
语句导入和重用函数和变量
my_math_constants.csvpp
pi := 3.14159
e := 2.7182818284
---
main.csvpp
use my_math_constants
fn circumference_from_diameter(r)
r * 2 * pi
fn radius_to_diameter(r)
2 * r
fn circumference_from_radius(r)
radius_from_diameter(radius_to_diameter(r))
---
Radius ,Circumference ,
[[var=radius]] ,"=circumference_from_radius(radius)" ,
格式化
你可以应用基本的单元格格式,这将对整行或单个单元格生效。要为单个单元格应用格式,请使用 [[
/]]
语法
[[text=bold/text=underline]]foo,[[fontsize=20]]bar,baz,
这里使用缩写语法实现相同的功能
[[t=b/t=u]]foo,[[fs=20]]bar,baz,
要格式化整个行,你可以在行的开头使用 ![[
/]]
![[t=b/t=u]]foo,bar,baz,
有关完整格式化功能的列表,请参阅 语言参考
其他阅读材料
依赖关系
~62MB
~840K SLoC