如何运行为Digitool4.3(2003)编写的算法?
我从事计算音乐工作。我发现2003 年在 Lisp 中实现的ps13 音高拼写算法,正是“Digitool MCL 4.3”。我想运行此代码,最好在 Linux x86 机器上运行,以将其结果与其他类似代码进行比较。
我是 Lisp 的新手,但到目前为止,我的研究使我认为 Digitool MCL 不再可用。我想到了两种可能对我有帮助的方法:
- 一个虚拟环境(Docker 或其他)可以模拟 2003 年的机器......
- 一种代码翻译工具,可以将 2003 年的源代码转换成今天可执行的代码
我没有成功找到这两个选项中的一个,也没有直接运行它sbcl(但是,作为一个新手,我可能错过了一个小的修改以使其易于运行)。
有人可以帮助我吗?
回答
概括
这段代码非常接近于便携式 CL:你不需要模拟古董 Mac 的东西来运行它。我在几分钟内在三个实现(SBCL、LispWorks、CCL)上运行了它。然而,如果你不是一个 Lisp 人(并且不想成为一个人),那么这样做会有点麻烦。
但是,我不能只向您发送固定版本,因为这不是适合此问题的论坛,还因为我们需要获得作者的许可才能这样做。我问过他是否对便携式版本感兴趣,如果他感兴趣,我会在适当的时候寄给他一个。您也可以联系并要求得到通知。
(元总结:虽然我认为这个问题很好,但任何合理的答案可能都不适合 SO。)
细节
这段代码的一个初始问题是该文件使用旧的 Mac 行结束约定(我认为:无论如何都不是 Unix):除非您使用的 Lisp 足够聪明以发现这一点(有些是,SBCL 似乎不是,尽管我是肯定有选项可以告诉它)你需要转换它。
鉴于此,实现该算法的代码非常非常接近于可移植的 Common Lisp。它对非标准事物有四个依赖:
- 两个全局变量,
*save-local-symbols*和*verbose-eval-selection*; - 两个函数:
choose-file-dialog和choose-directory-dialog。
全局变量可能可以安全地注释掉,因为我认为它们可能只是编译器的控件。这些函数有相当明显的规格:它们显然是为了弹出文件/目录选择器。
但是,您不能使用使用这些函数的代码部分,因此您可以编译它,获得一些有关未定义函数的编译器警告,然后就可以了。
但事实上它比这更好:MCL 的后期后代是Clozure CL:CCL 是免费的,并且是开源的。CCL 有choose-file-dialog并且choose-directory-dialog已经存在并且两个全局变量都存在,尽管一个不再导出。
不幸的是,有一些隐藏的可移植性问题与关于路径名看起来像字符串的假设有关:它对我认为在 OSX 之前的 Mac 上看起来是什么样子做出了一些假设。这种问题很容易解决,但解决起来往往有点麻烦(我认为在这种情况下会很容易)。所以,同样,答案就是不要调用正在执行大量路径名修改的事情:
> (ps13-test-from-file-list (directory "~/Downloads/d/*.opnd"))
[... much output ...]
Total number of errors = 81.
Total number of notes = 41544.
Percentage correct = 99.81%
nil
请注意,上面的输出来自LispWorks,而不是 CCL:不过,CCL 的效果与任何 CL 一样。
SBCL 有一个额外的问题:CL-USERSBCL 中的包已经使用了int在此代码中定义的导出包。所以你需要在其他一些包中编译它。但考虑到这一点,在 SBCL 中也很好。