scheme - Scheme 中的实现相关代码

标签 scheme lisp common-lisp racket language-features

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/

相关文章:

scheme - 在 Racket 中如何匹配?

functional-programming - 在Continuation Passing样式中定义定点组合器

macros - 为什么这个 Lisp 宏作为一个整体可以工作,即使每个部分都不起作用?

lisp - 如何将字符串转换为符号以用作 Lisp "assoc"函数中的键?

common-lisp - 向Common Lisp编译器保证算术表达式的结果是fixnum的最简单方法是什么?

scripting - GIMP - 编写 Canvas 大小调整脚本

scheme - 如何在 Scheme(Racket 或 ChezScheme)中实现 Python 风格的生成器?

lisp - ABCL 编译和原语

list - 如何创建 n 维列表?

lisp - 什么是印读一致性?