Scheme中的实现相关代码

时间:2015-03-26 09:01:58

标签: scheme lisp common-lisp racket language-features

Common Lisp中,当我想根据Common Lisp实施使用不同的代码片段时,我可以使用*features*并提供#+和{{1检查给定功能的可用性并相应地进行。例如(取自Peter Seibel的PCL):

#-

是否有人知道Scheme的类似机制?不同的Scheme实现之间有时会有微妙的差异,当你尝试移植时,很容易抽象出来。我想到的一个这样的情况是(defun foo () #+allegro (do-one-thing) #+sbcl (do-another-thing) #+clisp (something-else) #+cmu (yet-another-version) #-(or allegro sbcl clisp cmu) (error "Not implemented")) 默认情况下不提供可变对。而不是写例如Racket只有在您运行(set-cdr! lst '(1 2 3))之后才能使用set-mcdr!。当然,这些东西可以通过函数和/或宏来抽象,但我认为(require racket/mpair)方法在这方面很简洁。

1 个答案:

答案 0 :(得分:2)

最接近的是cond-expand(又名SRFI 0),它可以在某些方案上使用但不能在其他方案中使用(例如,Racket没有它,如果没有它,你的代码将无法编译你尝试使用它)。对于那些拥有它的方案,它看起来像cond形式,除了你测试布尔值,告诉你有关编译器/解释器的事情。在某些方案中,您可以检测到您正在运行的方案,而在其他方案上,您只能检查SRFI:

(cond-expand (chicken
              'bok-bok-bok!)
             ((and guile srfi-3432)
              'this-guile-is-full-of-SRFI!)
             (else
              '(might be MIT Scheme, whose cond-expand only tests for SRFIs)))