概括
这段代码非常接近于可移植的 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-USER
SBCL 中的包已经使用了int
此代码中定义的导出包。所以你需要在其他一些包中编译它。但鉴于此,在 SBCL 中也可以。