TGDZCalc by V 0.4.11 (38th)

V是一个还不太成熟的语言,虽然有一些优点,但问题也还不少,浅尝了一下。
除了最简单的V run xxx.v命令行运行,或者 v xxx.v编译成EXE,也可以在CLION中安装VLang插件后进行开发,目前较好支持它开发的IDE很少。

代码大体上还算优雅的。有些古怪的毛病 ,如函数名中不能用大写字母。错误处理方式比较奇特等,是一个有想法的新语言。

这是第38种语言来表达算法。

点击查看代码
module main
//注意源码文本用UTF-8格式保存
// 因为没有公元0年,因此遇到0年,定义其tgdz为空字符,甲子元年为0。这是特殊情况,视为出错。
fn year2tgdz(y int) string {
    if y==0 {return ""}
mut year:=y
year =  if year<0 {year-3} else {year-4}
for year<0 {year=year+60}
mut tg:=year % 10
mut dz:=year % 12

tg_arr:="甲乙丙丁戊已庚辛壬癸" //UTF-8 coded, so 3 bytes for Han
dz_arr:="子丑寅卯辰巳午未申酉戌亥"

return tg_arr[tg*3..tg*3+3] + dz_arr[dz*3..dz*3+3] //V语言内是前闭后开的区间表示。
}

fn calc_baseyear(y int) int {
    if y==0 {return 0} //baseyear==0 is error
mut year:=y
mut b:= if year>0 { 4 } else {-57}
for b>y {b=b-60}   //用for代替了while
for (b+60)<=y {b=b+60}
return b
}

fn tgdz2year(tgdz string, baseyear int) int {
    if tgdz=="" {return 0} //for empty tgdz, return 0 to say it is an error.
s1:=tgdz[0..3] //还是前闭后开的区间表示,字符串为UTF-8编码,此中汉字为3个字节。
s2:=tgdz[3..6]
tgstr:="甲乙丙丁戊已庚辛壬癸"
dzstr:="子丑寅卯辰巳午未申酉戌亥"

mut tgi:=tgstr.index(s1) or { // index函数返回的是?int,不能直接用于比较。
match err {                  
none {-3}
else {panic(err)}
}}

tgi=tgi/3
mut dzi:=dzstr.index(s2) or {
match err {
none {-3}
else {panic(err)}
}}
dzi=dzi/3


if tgi==-1 {exit}
if dzi==-1 {exit}
mut m:=0
if tgi>=dzi {m=tgi-dzi} else {m=tgi-dzi+12}
return baseyear + m*5 +tgi
//return 0
}
fn testproc(y int){
    tgdz:=year2tgdz(y)
    b:=calc_baseyear(y)
    year:=tgdz2year(tgdz,b)
    println("${y} ${b} ${tgdz}  ${year}")
}
fn main() {	
    println("Coded in V, run on V 0.4.11, 2025-7-4")

    println("---测试 公元前范围---")
    for y:=-400; y<= -300; y++ {testproc(y)}

    println("---测试 公元后范围---")
    for z:=1900; z < 2100; z++ {testproc(z)}
}


运行效果如下:

运行效果3(元前+元后)

编译好的文件也不大,300多KB的样子。

posted @ 2025-07-02 18:59  dingxianghuan  阅读(11)  评论(0)    收藏  举报