我如何 运行 为 Digitool 4.3 (2003) 编写的算法?
How can I run an algorithm written for Digitool 4.3 (2003)?
我从事计算音乐方面的工作。我找到了 2003 年在 Lisp 中实现的 ps13 pitch spelling algorithm,准确地说是“Digitool MCL 4.3”。我想 运行 这段代码,最好是在 Linux x86 机器上,将其结果与其他类似代码进行比较。
我是 Lisp 的新手,但到目前为止,我的研究使我认为 Digitool MCL 不再可用。我想到了两种可能对我有帮助的方法:
- 模拟 2003 年机器的虚拟环境(Docker 或其他)……
- 一种代码翻译工具,可将 2003 年的源代码转换为今天可执行的代码
我没有成功找到这两个选项中的一个,也没有 运行直接用 sbcl
将其 sbcl
(但是,作为新手,我可能错过了一个小修改以使其 运行轻松)。
有人可以帮助我吗?
总结
此代码非常接近于可移植的 CL:您不需要模仿古董 Mac 到 运行 的东西。我 运行 在几分钟内完成了三种实现(SBCL、LispWorks、CCL)。但是,如果您不是 Lisp 用户(并且不想成为 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 还有一个问题:SBCL 中的 CL-USER
包已经使用了导出 int
的包,该包在这段代码中定义。所以你需要在其他包中编译它。但考虑到这一点,它在 SBCL 中也很好。
我从事计算音乐方面的工作。我找到了 2003 年在 Lisp 中实现的 ps13 pitch spelling algorithm,准确地说是“Digitool MCL 4.3”。我想 运行 这段代码,最好是在 Linux x86 机器上,将其结果与其他类似代码进行比较。
我是 Lisp 的新手,但到目前为止,我的研究使我认为 Digitool MCL 不再可用。我想到了两种可能对我有帮助的方法:
- 模拟 2003 年机器的虚拟环境(Docker 或其他)……
- 一种代码翻译工具,可将 2003 年的源代码转换为今天可执行的代码
我没有成功找到这两个选项中的一个,也没有 运行直接用 sbcl
将其 sbcl
(但是,作为新手,我可能错过了一个小修改以使其 运行轻松)。
有人可以帮助我吗?
总结
此代码非常接近于可移植的 CL:您不需要模仿古董 Mac 到 运行 的东西。我 运行 在几分钟内完成了三种实现(SBCL、LispWorks、CCL)。但是,如果您不是 Lisp 用户(并且不想成为 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 还有一个问题:SBCL 中的 CL-USER
包已经使用了导出 int
的包,该包在这段代码中定义。所以你需要在其他包中编译它。但考虑到这一点,它在 SBCL 中也很好。