在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)
方法在这方面很简洁。
答案 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)))