在 Common Lisp
中,当我想根据 Common Lisp
实现使用不同的代码片段时,我可以使用 *features*
和提供的 #+
和 #-
符号来检查给定功能的可用性并相应地进行。例如(取自 Peter Seibel 的 PCL):
(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"))
有人知道 Scheme 的类似机制吗? Scheme 的不同实现之间有时会存在细微差别,当您试图实现可移植性时,最好将其抽象掉。我想到的一个例子是 Racket
默认不提供可变对。而不是写例如(set-cdr!lst '(1 2 3))
你必须使用 set-mcdr!
并且只有在你运行 (require racket/mpair) 之后
。当然,这些东西可以通过函数和/或宏来抽象,但我认为 Common Lisp
方法在这方面很巧妙。
最佳答案
最接近的是 cond-expand
(又名 SRFI 0),它在某些 Schemes 上可用,但在其他 Schemes 上不可用(例如,Racket 没有它,而您的代码如果您尝试使用它,将无法编译)。对于那些确实有它的方案,它看起来像一个 cond
形式,除了你测试 bool 值告诉你关于编译器/解释器的事情。在某些方案上,您可以检测到您正在运行的方案,而在其他方案上,您只能检查 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)))
关于scheme - Scheme 中的实现相关代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29274455/