【问题标题】:Best way to write portable Scheme code?编写可移植方案代码的最佳方法?
【发布时间】:2023-08-15 22:30:01
【问题描述】:

在 Common Lisp 中,我可以有条件地排除或包含不同实现的代码,如下所示:

#+sbcl (use-sbcl-cool-feature)
#-sbcl (use-my-own-not-so-cool-version)

这样我可以通过隔离不可移植的位来编写可移植的代码。

如何在 Scheme 中做到这一点?有没有办法像这样询问 Scheme 解释器或编译器的名称(甚至是它实现的标准)?

(cond ((r6rs?)
       (make-eq-hashtable))
      ((gambit?)
       (make-table))
      ;; other cases here
      (#t (make-my-inefficient-hash-table))

我知道我可以将所有可能的不可移植代码段包装在不同的过程中,然后拥有这样的兼容性包:

;; in my-libs-gambit.scm:
(define make-hash-table make-table)

同样适用于 my-libs-[other-schemes-here].scm

这是唯一的方法吗?

我不会尝试在 Scheme 中制作一个完全可移植的应用程序,但如果我可以让我的程序在两个或三个不同的实现中运行,那就太好了。

【问题讨论】:

    标签: scheme portability


    【解决方案1】:

    Slides of a talk by Dorai Sitaram 关于这个话题。 遵循here 给出的指示也可能会有所帮助。

    【讨论】:

    • 非常感谢维杰!我会研究一下 scmxlate——它似乎很适合我的需求。
    • Akku.scm 非常致力于帮助编写可移植的 Scheme 代码。
    最近更新 更多