В Common Lisp я могу условно исключить или включить код для различных реализаций, таких как:
#+sbcl (use-sbcl-cool-feature)
#-sbcl (use-my-own-not-so-cool-version)
Таким образом, я могу написать переносимый код, изолировав непереносимые биты.
Как это можно сделать на схеме? Есть ли способ задать интерпретатору или компилятору 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- [другие схемы здесь] .scm
Это единственный способ сделать это?
Я бы не пытался создать полностью переносимое приложение в Scheme, но было бы неплохо, если бы мои программы работали в двух или, может быть, трех разных реализациях.