在上一篇随笔中介绍了四种编程语言。这次再介绍四种编程语言:Fortran、Lua、Lisp 和 Logo。
Fortran
Fortran 语言在2010年6月编程语言排行榜中排名第三十一位。下面就是 GregorianTest.for 程序:
我没有在 Fortran 语言的标准库中找到设置指定日期的函数,只好从 1970-01-01 往回倒数 141,438 天得到 1582-10-04 。
安装 GNU Fortran 编译器,编译和运行:
运行结果和 C 语言一样。
Lua
Lua 语言在2010年6月编程语言排行榜中排名第十七位。下面就是 GregorianTest.lua 程序:
安装 Lua 软件包。luac 是编译器,用于将源程序编译为字节码,默认的文件名是 luac.out,luac –l 可以查看字节码。lua 可以作为交互窗口,也可以解释执行 lua 源程序,还可以用于运行编译后的字节码:
运行结果和 C 语言一样。
Lisp
Lisp 语言在2010年6月编程语言排行榜中排名第十六位。下面就是 GregorianTest.lisp 程序:
安装 GNU Common Lisp 软件包,gcl 可以作为交互窗口,也可编译源程序(使用 –compile 参数),还可以解释执行(使用 –f 参数):
运行结果基本和 C 语言一样,但是有一个 bug,认为 1582-10-04 是1583年1月的第 –88 天。这是一个很奇怪的 bug,其它大部分日期是正常的,如下所示:
此外,还可以选择安装 GNU CLISP 软件包,clisp 是符合 ANSI Common Lisp 标准的编译器、解释器和调试器:
可以看出,GNU CLISP 不支持 1900-01-01 以前的日期。
Logo
在2010年6月编程语言排行榜中排名第三十六位的 Logo 语言的原型来自 Lisp 语言,内置一套海龟绘图系统,很适合于儿童学习。下面是一个用海龟绘图的 mn_eck.logo 程序:
1: to n_eck :ne :sz
2: repeat :ne [rt 360 / :ne fd :sz]
3: end
4:
5: to mn_eck :ne :sz
6: repeat :ne [rt 360 / :ne n_eck :ne :sz]
7: end
8:
9: mn_eck 36 20
安装 UC Berkeley Logo 软件包,启动交互窗口:
运行结果如下所示:
我没有在 Logo 语言中找到有关日期方面的函数。如果有哪们朋友知道的话,请在评论中告诉我。谢谢!
总结
儒略历1582年10月4日星期四的下一天是格里历1582年10月15日星期五。能够正确处理的语言有:
- Java (使用 java.util.GregorianCalendar 类)
- Scala (使用 java.util.GregorianCalendar 类)
- Ruby (使用 Date 类)
- Visual Basic.NET (使用 System.Globalization.Calendar 相关的类,必须由用户自己指定使用儒略历还是格里历)
- C# (使用 System.Globalization.Calendar 相关的类,必须由用户自己指定使用儒略历还是格里历)
- F# (使用 System.Globalization.Calendar 相关的类,必须由用户自己指定使用儒略历还是格里历)
- PHP (使用 cal_to_jd 和 cal_from_jd 函数,必须由用户自己指定使用儒略历还是格里历)
把格里历外推到1582年10月15日之前,取代儒略历,从而认为1582年10月4日是星期一的语言有:
- Visual Basic.NET (使用 System.DateTime 类)
- C# (使用 System.DateTime 类)
- F# (使用 System.DateTime 类)
- C (GNU C 编译器,使用 tm 结构和 mktime 函数)
- C++ (使用 boost::gregorian::date 和 date_duration 类)
- Python (使用 date 和 timedelta 类)
- JavaScript (使用 Date 类)
- Perl (使用核心模块的 localtime 和 timelocal 函数,或者使用 DateTime 模块)
- Fortran (使用 ctime 函数,必须由用户自己从 1970-01-01 倒数 141,438 天得到 1582-10-04)
- Lua (使用 os.time 和 os.date 函数)
- Lisp (使用 GNU Common Lisp 软件包,使用 encode-universal-time 和 decode-universal 函数)
认为1582年10月有4日是星期二或者星期六(很奇怪的决定)的语言有:
- PHP (使用 DateTime 类)
- Delphi (使用 Free Pascal 编译器,使用 TTimeStamp 类型和 EnCodeDate、DateTimeToTimeStamp 函数)
标准库不支持1582年10月4日,或者无法计算某一日期是星期几的语言有:
- C (Microsoft Visual Studio 2010 的 C++ 编译器,使用 tm 结构和 mktime 函数)
- Pascal (使用 GNU Pascal 编译器,使用 TimeStamp 类型和 GetTimeStamp 函数)
- Lisp (使用 GNU CLISP 软件包,使用 encode-universal-time 和 decode-universal 函数)
- Logo (使用 UC Berkeley Logo 软件包,没有找到有关日期的函数)
参考资料
- GNU Fortran
- GNU Fortran: CTIME: Convert a time into a string
- The Programming Language Lua
- Programming in Lua: Date and Time
- Wikipedia: Lisp (programming language)
- The Common Lisp Cookbook – Dates and Times
- Wikipedia: Logo (programming language)