Scheme
Scheme是一种函数式编程语言，是Lisp的两种主要方言之一，不同于与之并列的Common Lisp，Scheme遵循哲学，以一个小型语言核心作为标准，加上各种强力语言工具（语法糖）来扩展语言本身。
Scheme最早由麻省理工學院的蓋伊·史提爾二世與傑拉德·傑伊·薩斯曼自1975年開始發展出來，並由兩人發表的「λ論文集」推廣開來。Scheme語言與λ演算關係十分密切。小寫字母「λ」是Scheme語言的標誌。Sheme是第一個使用靜態作用域的Lisp方言，也是第一个引入“”和头等续体的编程语言。
麻省理工學院與其他院校曾采用Scheme教授计算机科学入門課程。著名的入門教材《-{zh-hans:计算机程序的构造和解释;zh-hant:電腦程式的構造和解釋}-》（SICP）利用Scheme來解釋程序設計。Scheme的廣泛受眾被視為一個主要優勢，然而不同實現之間的差異成為了它的一個劣勢，Scheme掌控委员会声称它是“世上最不可移植的编程语言”并且是一个“编程语言家族”而非一个单一的语言。
Scheme起源於約翰·麥卡錫於1958年提出的Lisp語言。通過Lisp，麥卡錫證明了圖靈完備的系統，可以僅僅由幾個簡單的算子，與用於匿名函數的借鑒自阿隆佐·邱奇的λ表示法組成。這一設計對Scheme的影響非常深刻。麥卡錫提出的S-表达式具備同像性（即程序与数据由相同的结构存储）。Scheme的語法即來自S-表达式，這一特性使得在Scheme中實現自循環直譯器變得非常簡單。
Scheme的靈感，來自麻省理工學院的提出的一種叫做演員模型的計算模型。Hewitt當時為了實作演員模型，正在試圖創建新的語言（後改稱PLASMA，即建模在演員上的類PLAnner系統），而受其影響的史提爾與薩斯曼，決定在Maclisp中實現一個支援演員模型的Lisp方言。史提爾與薩斯曼兩人，很快發現演員模型與λ演算非常類似，而所謂「演員」就是Peter J. Landin提出的閉包，它由於1970年介入LISP来解决。因此兩人很快意識到，將詞法變數範圍介入到Lisp中，是實現演員的關鍵。基於這一見解，兩人很快開發出了一套精簡的程式語言，並命名為「Schemer」，後因作業系統字數限制改為Scheme。儘管Hewitt指出了Scheme有不能表达特定类型的演员的不足，它簡約的語法很快贏得廣泛接受，並成為最具影響力的程式語言之一。
「λ論文集」是Scheme的發明人史提爾與薩斯曼所撰寫的關於程式語言設計的一系列論文，最早作為麻省理工學院的內部備忘錄發表。Scheme的功能很大一部分是由這些論文確立的。通常認為λ論文集包括：
在1978年，蓋伊·史提爾二世和傑拉德·傑伊·薩斯曼发表了《修订的Scheme报告：一种LISP方言》。Scheme曾經由IEEE標準化為IEEE 1178–1990，它于2019年11月07日停用。現在由一個專門的掌控委員會發表的《第n次修訂的演算法語言Scheme報告》（Revised Report on the Algorithmic Language Scheme）是業界標準。这种标题形式参照了ALGOL 60标准文档的标题。
1998年通过的RRS是現在被普遍接受的標準。而2007年通過的RRS，做出了很大的變動，Scheme社區中有使用者指責它在堆積華而不實的功能。Scheme掌控委員會決定在RRS中，將Scheme分化為兩個獨立而兼容的語言：一個是現已通過了的RRS small，它為教學場合提供对IEEE/RRS標準的及时更新，而另一個是大型語言，它為實際編程場合提供对RRS標準的继续完善。
在正式场合比如Scheme标准中，提及一个λ表达式或原始过程时，偏好使用词语“过程”而非“函数”。在一般使用中，词语“过程”和“函数”是可互换使用的。过程应用有时被正式称呼为“组合”（combination）。
同其他Lisp一样，在Scheme中使用术语“”，来提及没有实际参数的过程。术语“正当尾递归”，称谓所有Scheme实现的一个性质，它们都进行尾递归优化，从而支持无限数目的活跃尾递归。
Scheme大体上是一個函數式程式語言，並支援其他编程范型。它同其他Lisp编程语言家族语言共享了很多特征。它的非常简单的語法基於Lisp的S-表达式：即圆括号包围的列表，其中的前缀是算符，而随后那些的是实际参数。故而Scheme程序由嵌套的列表的序列构成。列表也是Scheme中的主要数据结构，这导致了在源代码和数据格式之间的紧密等价性，即同像性。Scheme程序可以轻易的动态建立和求值Scheme代码片段。
Scheme與其他Lisp方言的列表，都是基於最基礎的數據結構有序對（pair）。Scheme从它的Lisp先辈继承了一组丰富的列表处理原始运算，比如cons、car和cdr。Scheme的變數都使用動態強型別系統，Scheme中的过程都是頭等物件，因此过程可以作为值赋值给变量，或作为实际参数传递给过程。
本章主要集中于语言的创新特征，它们使得Scheme区别于其他Lisp方言。除非专门指出，这里描述的特征都有关于RRS标准。在本章例子中使用“===> 结果”表示法，来指示求值在紧前行上的表达式的结果。这同于RRS中使用的约定。本章节描述的特征使得Scheme不同于在它之前的其他编程语言。Scheme的这些方面强烈的影响了Scheme语言的所有产品，并共通于自从1975年最初的λ论文，特别是1978年最初修订报告以来，所有版本的Scheme编程语言。
Scheme的簡約性使它成為具備同級別功能的程式語言中最易於實現的語言。能这么容易是使用λ演算来从更原始的形式导出多数的语言语法所贡献的。例如在RRS Scheme标准中，定义了23个基于S-表达式的语法构造，其中14个被归类为派生形式或库形式，它们可以被写为涉及原则上为lambdad的更基础形式的宏。正如RRS（§3.1）所说：“最基础的变量绑定构造是lambda表达式，因为所有其他的变量绑定构造，都可以依据lambda表达式来做出解释”。 下面是一个宏的例子，它将codice_11实现为使用codice_2来进行变量绑定的一个表达式：
(define-syntax let 使用上述定义的codice_11，一个Scheme实现可以将codice_27，重写为codice_28，这将实现任务缩减为编码过程实例化的工作。
當Scheme被廣為接受後，在1998年，史提爾與薩斯曼曾承認，他們事實上沒有刻意實現Scheme的簡約性。兩人認為簡單而強大的λ演算，最終使得Scheme得以實現極度的精簡化。
像多数现代语言而不像更早期的Lisp比如Maclisp，Scheme是词法作用域的：在一个程序单元中所有可能的变量绑定，都可以通过阅读这个程序单元来分析出来，而不需要考虑到它可能在其中被调用的那些上下文。这对比于动态作用域，它是早期Lisp方言的特征，因为在当时的编译器和解释器中，用来实现词法作用域算法的原始的文字替换方法，关联着处理代价。在那些Lisp中，对一个过程内的自由变量的引用，依赖于这个调用的上下文，完全有可能引用到这个过程外部的相当不同的绑定。
邱奇的λ演算的数学表示法，启发了Lisp使用codice_2作为介入一个过程的关键字，并影响了Lisp中涉及到使用高阶函数的函数式编程技术的发展。但是早期的Lisp，由于它们对自由变量的处理方式，不适合表达λ演算。
一个正式的λ系统，拥有一些公理和一个完备的推理规则。这有助于使用数理逻辑和工具来进行分析。在这个系统中，演算可以被看作直接的演绎。λ演算的语法，来自用codice_30、圆括号、空格、点号和符号λ形成的递归表达式。λ演算的功能包括：首先，充当强力的数理逻辑的起点。其次，它可以缩减编程者在考虑实现细节上的要求，因为它可以用于模拟机器求值。最后，λ演算建立了一个坚实的元理论。
在Scheme中，codice_2關鍵字被用於定義匿名过程，并且使用codice_1基础形式来定义命名过程，即将一个codice_2过程绑定到指名的全局变量。在Scheme中，codice_34與codice_35，在語法上是等同的。例如有序對可以表示為：
這樣定義出來的codice_36、codice_37和codice_38，滿足恆等式codice_39等於codice_40，和codice_41等於codice_42。甚至递归也可以表示为利用λ演算的Y组合子。
词法作用域的介入，通过在某些形式的λ表示法，和在工作编程语言中它们的实际表达之间做出等价，解决了早期Lisp的有关问题。Sussman和Steele展示了，通过将λ表达式用作“控制结构和环境修改器”，而非简单的过程实例化，可以用这个新语言优雅的导出其他编程语言包括ALGOL和Fortran的，所有指令式和声明式语义，和其他Lisp的动态作用域。他们在第一篇λ论文中，与对Scheme的首次描述一起，介入了，并在后续的论文中，他们推进演示了λ演算的这种实际使用的原生能力。
Scheme采用了传值调用，但不同于多数Lisp规定了过程实际参数的求值次序，Scheme不规定求值次序。对比于其他Lisp，Scheme表达式在算符位置（第一个项目）上可以是一个表达式，只要在算符位置上的表达式的结果是一个过程，这种表示就是完全合法的。
在Scheme中，在算符和实际参数位置上的这些表达式的求值次序，可以在逐个调用的基础上由实现来选择，而唯一的约束是：“运算符和运算数表达式的任何并发求值的效果，被约束为一致于某种顺序次序的求值。”（RRS sec. 4.1.3）
===> 3
codice_43是一个过程，它描述传递给它的实际参数，接着返回这个实际参数的值。在调用过程codice_44来加codice_45和codice_46之中，表达式codice_47、codice_48和codice_49可以按任何次序求值，只要效果上它们不像是并行求值的。因此在上述例子被执行的时候，下列三行可以被标准Scheme按任何次序来显示，然而一行的文本不可以同另一行的文本产生交错，因为这会违反顺序求值约束。
Scheme的代碼塊結構繼承自更早時候的語言。自从RRS开始，Scheme中的块，是通过三个“绑定构造”来实现的：、codice_12和codice_13。例如，下列构造建立一个块，其中叫做codice_52的符号被绑定到数codice_53：
(let ((var 10)) 依据编程者的需要，块可以来建立任意复杂的块结构。使用块结构来建立局部绑定，减轻了不然可能发生的。
codice_11的变体之一codice_12，允许绑定引用在前面相同构造中定义的变量，例如：
codice_11的另一个变体codice_13，被设计用来确使互递归过程可绑定彼此。
下面的例子是侯世达：
(define (hofstadter-male-female n)
===> ((1 . 0) (1 . 0) (2 . 1) (2 . 2) (3 . 2) (3 . 3) (4 . 4) (5 . 4) (5 . 5))
在一个单一的codice_13中的所有过程，可以通过名字引用其他的过程，还有在相同的codice_13中此前定义的变量的值，但是它们不可以引用在相同的codice_13中此后定义的变量的值。
codice_11的变体“命名codice_11”形式，在codice_11关键字之后有一个标识符。它将这些codice_11变量绑定到一个过程的实际参数，这个过程的名字由这个标识符给出，它的过程体是codice_11形式的主体。这个过程体可以通过调用这个过程达成想要的重复。命名codice_11被广泛用于实现迭代。
一个简单的计数器例子:
===> (1 2 3 4 5 6 7 8 9 10)
就像Scheme中的任何过程一样，在命名codice_11中建立的这个过程是头等对象。
Scheme拥有一个迭代构造codice_10，但是在Scheme中更推崇的，是使用尾递归来表达迭代。遵循标准的Scheme实现被要求优化尾递归，从而支持无限数量的活跃尾递归（RRS sec. 3.5），这个性质被Scheme报告描述为“正当”（proper）尾递归，它使得Scheme编程者可以安全的使用递归结构来书写迭代算法，这在很多时候是更符合直觉的。尾递归过程和命名codice_11形式，提供对使用尾递归的迭代的支持。 (define (list-of-squares n)
===> (0 1 4 9 16 25 36 49 64 81)
在Scheme中续体是头等对象。自从RRS开始，Scheme提供了过程codice_70（简写为codice_71），通过把当前续体包装成脱离（escape）过程来捕获它，并把它绑定到编程者提供的一个过程的一个形式参数（RRS sec. 6.4）。头等续体使得编程者能够建立非局部控制结构比如迭代、协程和回溯。
续体可以被用来模拟指令式编程语言中return语句的行为。下列函数codice_72接受函数codice_73和列表codice_74，返回codice_74中的第一个元素codice_40，它使得codice_77返回真。
===> 7 ===> #f David Madore在1999年提出的阴阳谜题，展示了Scheme可以将续体当作头等对象处理，绑定它们到变量，和把它们作为给过程的实际参数来传递。
对比于Common Lisp，在Scheme中所有的数据和过程共享一个共同的命名空间，而Common Lisp中有函数和数据分离的命名空间，使得一个函数和一个变量可以有相同的名字，并且将一个函数作为值引用时要求特殊的表示法。这有时叫做“Lisp与Lisp”差异，二者分别称谓Scheme的统一的命名空间，和Common Lisp的分立的命名空间。
在Scheme中， 可以使用操纵和绑定数据的原始运算来绑定过程。没有等价于Common Lisp的codice_78和codice_79的原始运算。
(define f 10) f ===> 10 (set! f (+ f f 6)) f ===> 26 (set! f (lambda (n) (+ n 12))) ===> 18 (set! f (f 1)) f ===> 13 (apply + '(1 2 3 4 5 6)) ===> 21 ===> (101 102 103) 本章归档多年来做出的给与Scheme特定特征的设计决定，它们不是最初设计的直接产物。
直到RRS标准，在Scheme中的标准注释是分号，它使得这行余下部份对Scheme不可见。许多实现支持可替代的约定，允许注释扩展为多于一行，而RRS标准允许其中的两种：一个完整的S-表达式，可以通过前导codice_80 而变成一个注释（介入于SRFI 62），和通过用codice_81和codice_82围绕文本，产生的“多行注释”或“块注释”。
在多数Lisp方言包括Common Lisp中，布尔表达式中的值codice_83按照惯例被求值为值假。在Scheme中，自从1991年的IEEE标准，除了codice_84的所有的值，包括在Scheme中写为codice_85的codice_83的等价者，在布尔表达式中求值为值真（RRS sec. 6.3.1）。
在多数Lisp中表示布尔值真的常量是codice_87，而在Scheme中它是codice_88。
Scheme的语法可以轻易的通过宏系统来扩展。RRS标准介入了强力的干净宏系统，它允许编程者使用一种简单的模式匹配子语言，向语言增加的新的语法构造（RRS sec 4.3）。在此前的RRS标准中，干净宏系统已经作为“高级”系统，和“低级”宏系统一起被编排入标准的附录中，二者都被当作对Scheme的扩展而非语言的本质部份。
干净宏的实现，也叫做codice_8, 被要求遵守语言的其余部份的词法作用域。这是通过针对宏展开的特殊命名和作用域规则来确保的，从而避免在其他编程语言的宏系统中可能出现的常见编程错误。RRS规定了更加复杂的变换系统codice_90，它已经作为对RRS Scheme的一个语言扩展而能够获得到有一段时间了。例如：
(define-syntax when 宏和过程的调用看起来非常相似，二者都是S-表达式，但是它们被不同的对待。在编译器遇到程序中的一个S-表达式的时候，它首先查看这个符号是否被定义为在当前词法范围内的语法关键字。如果是这样，它接着尝试展开这个宏，将在这个S-表达式尾部的项目当作实际参数，而不用编译代码来求值它们，递归的重复这个处理过程直到没有余留的宏调用。如果它不是一个语法关键字，编译器编译代码来求值在这个S-表达式尾部的实际参数，并接着求值在这个S-表达式头部的符号所表示的变量，把它作为过程来调用，并把最终的尾部表达式作为实际参数传递给它。
多数Scheme实现还提供额外的宏系统。其中最流行是、和codice_91，它是类似于Common Lisp中提供的codice_92系统的非干净宏。
不能指定一个宏是否为干净的，是宏系统的一个缺点。可作为替代的展开模型比如作用域集合，提供一种潜在的解决方案。
自从RRS开始，Scheme通过codice_20形式和过程codice_94支持延迟求值。
===> 22 ===> 70 ===> 22 这些原始运算，产生或处理叫做promise的值，promise的原本定义的文字内容被留存了，并且在第一次使用codice_94之后它的值也被留存了。promise永远只求值一次。它们可以被用来实现高级的惰性求值构造比如串流。
在RRS中，给出了codice_20和codice_94的推荐实现，将promise实现为没有实际参数的一个过程（），并使用记忆化来确保它永远只求值一次，与调用codice_94的次数无关（RRS sec. 6.4）。在RRS标准中，它们不再是原始运算，转而作为RRS兼容库的一部份提供（rnrs r5rs (6)）。
SRFI 41确使有限和无限序列能够具有非凡经济性的表达。例如，这是使用在SRFI 41中的函数定义的一个斐波那契数列： (define fibs (stream-ref fibs 99) ===> 218922995834555169026 RRS标准之前，在其他Lisp中无处不在的codice_99过程，在Scheme中没有等价者。在第一篇λ论文中，曾经将codice_100描述为“类似于LISP函数EVAL”，但在具有词法作用域的Scheme中，对这个表达式在哪个环境中求值存在困惑。例如，不明确求值下列表达式的结果应当是codice_101还是codice_102：
在求值实际参数codice_103的时候，在外层环境中找到了它的定义；在求值结果表达式codice_104的时候，如果在外层环境中求值，结果是两个运算数的总和；如果在内层环境中求值，这里符号codice_44已经被绑定到过程codice_106的值，结果是两个运算数的乘积。为此在1978年的最初修订报告中，将codice_100替代为codice_108，它接受分别为代码和运行环境的两个实际参数。由于各种技术和实际原因，第二次、第三次和第四次修订报告省略了任何codice_99的等价者。
RRS通过规定三个返回环境的过程，并提供接受一个S-表达式和一个环境的过程codice_99，它在提供的这个环境内求值这个表达式（RRS sec. 6.5），解决了这个困惑。RRS通过提供叫做codice_111的一个过程进行了扩展，编程者通过它可以精确的指定将哪个对象导入到求值环境之内。
通过现代Scheme（通常兼容于RRS）来求值表达式codice_112，你需要定义如下这样的一个函数codice_100： codice_114是解释器的全局环境。
Scheme规定了数值数据类型的相较完全的集合，包括复数和有理数类型，这在Scheme中叫做“数值塔”（RRS sec. 6.2）。标准对它们作抽象处理，而不委以任何特定的内部表示。
数可以有精确性品质。一个精确数只能从涉及其他精确数的精确运算产生，不精确是传染的。标准规定任何两个实现对产生精确数的所有运算都必须产生等价的结果。
RRS标准规定了过程codice_115和codice_116，它们可以用于改变一个数的精确性。codice_116产生“在数值上最接近实际参数的精确数”。codice_115产生“在数值上最接近实际参数的不精确数”。RRS标准在主报告中省略了这些过程，而是在标准库中将它们规定为RRS兼容过程（rnrs r5rs (6)）。
在RRS标准中，不要求Scheme实现去实现整个数值塔，而是它们必须实现“符合实现用途和Scheme语言精神二者的连贯子集”（RRS sec. 6.2.3）。新的RRS标准要求实现整个数值塔，并且“精确整数对象和精确有理数对象实际上有无限的大小和精度，并且对于实现特定过程...所以它们在得到精确实际参数时总是返回精确结果”（RRS sec. 3.4, sec. 11.7.1）。
在支持精确有理复数的实现中的精确算术例子：
(define x (+ 1/3 1/4 -1/5 -1/3i 405/50+2/3i)) x ===> 509/60+1/3i (exact? x) ===> #t 在既不支持精确有理数也不支持复数却接受有理数表示法的实数的实现中相同算术的例子：
(define xr (+ 1/3 1/4 -1/5 405/50)) (define xi (+ -1/3 2/3)) xr ===> 8.48333333333333 xi ===> 0.333333333333333 (exact? xr) ===> #f ===> #f 二者实现都符合RRS标准，但是第二个实现不符合RRS，因为它没有实现完整的数值塔。
在Scheme中原始数据类型是不相交的。对于任何Scheme对象，下列谓词中只有一个可以为真：codice_119、codice_120、codice_121、codice_122、codice_123、>codice_124、codice_125、codice_126和codice_127（RRS sec 3.2）。
作为对比，在数值数据类型之内，对数值值是可以有交叠的。例如，一个整数值可以同时满足如下谓词：codice_128、codice_129、codice_130、codice_131和codice_122（RRS sec 6.2）。
Scheme在任意对象之间有三种不同类型的等价，它们通过三种不同的“等价谓词”来指示，即测试等式的关系算符codice_133、codice_134和codice_135：
在Scheme中还存在依赖于类型的等价运算：codice_143和codice_144比较两个字符串（后者进行不依赖大小写比较）；codice_145和codice_146比较字符；codice_147比较数。
Scheme的输入和输出基于了“端口”数据类型（RRS sec 6.6）。RRS定义了两个缺省端口，可通过过程codice_148和codice_149来访问，它们对应于Unix概念的标准输入和标准输出。多数实现还提供codice_150。标准通过标准过程比如codice_151和codice_152，支持输入和标准输出的重定向。多数实现提供有重定向能力的字符串端口，使用在SRFI 6中描述的过程，确使很多常规的输入-输出运算能在字符串缓冲区上进行而非在文件上。RRS标准规定了更多复杂和有能力的端口过程和很多新的端口类型。
下面的例子是使用严格的RRS Scheme书写的。
例子1，缺省输出到codice_149：
例子2，类似例子1但对输出过程使用可选的端口参数的例子：
类似例子1，但是输出被重定向到一个新建文件：
(let ((hello0 (lambda () (display "Hello world") (newline))))
类似例子2，但是具有显式的文件打开和端口关闭来发送输出到文件：
类似例子2，但是使用codice_154来发送输出到一个文件：
对输入提供了类似的过程。RRS Scheme提供了谓词codice_155和codice_156。对于字符输入和输出提供了codice_157、codice_158、codice_159和codice_160。为了书写和阅读Scheme表达式，Scheme提供了codice_161和codice_162。在读运算时，如果输入端口到达了文件的结束处，则返回的结果是codice_163对象，并且这可以使用谓词codice_164来测试。
除了标准之外，SRFI 28定义了一个基本的格式化过程，类似Common Lisp的codice_165并以此命名。
在Scheme中，过程被绑定到变量。在RRS中语言标准正式的授权编程者可以变更内建过程的变量绑定，在效果上重定义它们（RRS "Language changes"）。例如，通过重定义codice_44可以将它扩展为同接受数一样接受字符串： (set! + ===> 6 ===> "123" 在RRS中所有绑定，包括标准过程，都属于某个库，并且所有导出的绑定都是不可变的（RRS sec 7.1）。因此，禁止通过变更进行标准过程的重定义。转而，可以在标准过程的名字下导入不同的过程，这在效果上类似于重定义。
Scheme语言正式的定义在标准RRS（1998年）和RRS（2007年）之中。它们描述了标准“形式”，即关键字和随同的语法，它们提供语言的控制结构，和执行通常任务的标准过程。
在标准Scheme中，从一个数据类型转换到另一个数据类型的过程，在它们的名字中包含字符串codice_167，谓词结束于一个codice_168，而改变已经分配了数据的值的过程结束于一个codice_169。Scheme编程者通常跟从这些命名约定。
本表格描述Scheme中的标准形式。某些形式出现在不止一行之中，因为它们不能被轻易的归类入语言中的一个单一功能。
在表格中标记了“L”的形式被归类为标准中的派生的“库”形式，并且在实践中通常被实现为使用了更基础形式的宏，这使得实现任务比在其他语言中要容易许多。 注意codice_18在RRS中被定义为库语法，但是展开者需要知道它来完成分片功能。在RRS中它不再是库语法。
下面两个表格描述在RRS Scheme中的标准过程。RRS更加具有可扩展性而如此总结是不实际的。
某些过程出现在不止一行之中，因为它们不能轻易的分类入语言的一个单一功能。 在其名字中包含codice_171的字符串和字符过程，在它们的实际参数之间进行不依赖大小写的比较：相同字符的大写和小写版本被认为是相等的。
接受多于一个实际参数的codice_172和codice_173在RRS中被定义了但留作为可选的。
由于Scheme的极简主义，很多常见过程和语法形式不是由标准定义的。 为了保持核心语言很小并促进扩展的标准化，Scheme社群拥有“Scheme实现要求”（SRFI）流程，通过对扩展提案的仔细研讨来定义扩展库。这提升了代码可移植性。很多SRFI被几乎所有Scheme实现支持。
在不同的实现中具有相当广泛支持的SRFI包括：
Scheme的精簡設計，使得程式語言設計人士與愛好者，特別鍾愛研究它的實作，很多嵌入式系統語言與腳本語言，即是基於Scheme。Scheme的實作一般小而精簡，造成了很多不可互通的實作互相競爭。儘管Scheme的精簡性是它的一個主要長處，但试图使用Scheme编写既复杂又便于移植的程序，往往比较困难，主要原因之一，是因为Scheme没有库函数标准。而RRS试图完成这样的工作，它定义了两套标准，核心语言以及标准库。这使得Scheme第一次有了库函数标准，也使得编译器开发者和贡献者可以实现Scheme的可移植库。
幾乎所有Scheme實作都是基於Lisp的「讀取﹣求值﹣輸出循環」模式。一些Scheme實作亦可作為編譯器，並將Scheme程式譯為二進制碼。很多用類似C的基礎語言寫成的軟體，都利用Scheme作為腳本語言。還有一些Scheme解釋器，比如Gambit、Chicken和，可將Scheme程式譯為C或JVM字节码，甚至是.Net字节码。
一些实现支持额外的特征。比如和JScheme提供与Java类的集成，而Scheme到C编译器通常易于使用C写成的外部库，甚至允许将实际C代码嵌入到Scheme源代码中。另一个例子是，它提供了支持Scheme学习的一组可视工具。
最基本的Scheme實作是在《-{zh-hans:计算机程序的构造和解释;zh-hant:電腦程式的構造和解釋}-》中實現的自循環直譯器。這一直譯器以Scheme寫成，並利用底層的Scheme功能，來實現被執行的Scheme語言程式。由於要想運行自循環直譯器，電腦中必須已經存在一個Scheme直譯器，在實際上這一直譯器的意義不大，然而它簡單的語法可以幫助使用者理解Scheme的執行過程。很多著名的電腦科學院校都利用Scheme來教授入門級課程。以下為一些最為著名的教授Scheme的學校：
自由軟體影像處理程式GIMP利用Scheme為嵌入式脚本語言。GNU的扩展語言Guile是一个Scheme的实现，GNOME中有到核心库的一个Guile包装器 。