【发布时间】:2015-05-30 05:35:28
【问题描述】:
在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 方法在这方面很简洁。
【问题讨论】:
-
方案有几个标准规范,最常见的是R5RS、R6RS、R7RS。选择你想问的问题,在问之前研究它。
-
在 Racket 上,
set-mcdr!仅适用于 完全独立的数据结构,而这不是map、foldl、filter或基本上不支持的数据结构库中需要列表的任何函数。 Racket 的运行时库仅支持不可变列表。 -
@ThrowawayAccount3Million 你的意思是Racket 语言不是Scheme。 Rackets rnrs-implementations 支持可变对就好了。
-
@ThrowawayAccount3Million,你说的没错,但问题的核心是区分实现的机制。
标签: scheme lisp common-lisp racket language-features