Scheme is a general-purpose, functional, programming language descended from Lisp and Algol. It is a statically scoped and properly tail-recursive dialect of Lisp.
Scheme is a very simple language with a very simple syntax based on s-expressions. Its simplicity is fundamental in making it a popular introductory language. It follows a minimalist design philosophy specifying a small standard core with powerful tools for language extension. This philosophy helps make Scheme a programming language that can be learned over a weekend. Nevertheless, Scheme is a very versatile language being used to write a diverse range of applications such as financial analysis tools, compilers, virtual reality systems, as well as more mundane software.
Scheme is used in computing education and research as well as a wide range of industrial applications.
None of the books featured below are released under an open source license.
1. The Scheme Programming Language by R. Kent Dybvig
Scheme is now a complete general-purpose programming language, though it still derives its power from a small set of key concepts.
This book is intended to provide an introduction to the Scheme programming language but not an introduction to programming in general. The reader needs some experience programming and be familiar with terms commonly associated with computers and programming languages. This book covers the language of the Revised 6 Report.
- Introduction – describes the properties and features of Scheme that make it a useful and enjoyable language to use and describes Scheme’s notational conventions and the typographical conventions employed in this book.
- Getting Started – an introduction to Scheme programming for the novice Scheme programmer that leads the reader through a series of examples, beginning with simple Scheme expressions and working toward progressively more difficult ones.
- Going Further – covers more advanced features and concepts such as syntactic extension, continuations, and libraries.
- Procedures and Variable Bindings – describes operations for creating procedures and variable bindings including variable references, lambda, case-lambda, local binding and more.
- Control Operations – examines program control operations.
- Operations on Objects – operations on the various object types (including lists, numbers, and strings).
- Input and Output – transcoders, opening files, standard ports, string and bytevector ports, opening custom ports, port operations, input operations, output operations, convenience I/O, filesystem operations, and bytevector/string conversions.
- Syntactic Extension – looks at keyword bindings, syntax-rules transformers, syntax-case transformers.
- Records – record-type definitions.
- Libraries and Top-Level Programs – standard libraries, defining new libraries, and top-level programs.
- Exceptions and Conditions.
- Extended Examples.
2. Concrete Abstractions – An Introduction to Computer Science Using Scheme by Max Hailperin, Barbara Kaiser, and Karl Knight
Concrete Abstractions – An Introduction to Computer Science Using Scheme covers the basics of programming and data structures, and gives first-time computer science students the opportunity to not only write programs, but to prove theorems and analyze algorithms as well.
The book features thorough integration of theory and practice, and presents theory as an essential component of practice, rather than in contrast to it.
- Computer Science and Programming – examines procedures from several different viewpoints. It shows the reader how to write simple, non-recursive procedures in Scheme.
- Recursion and Induction – introduces students to recursion as a way of generating processes of varying sizes.
- Iteration and Invariants – introduce iteration as an alternative to recursion, and show how an iterative process uses less memory than a recursive one.
- Orders of Growth and Tree Recursion – orders of growth, tree recursion and digital signatures, an application: fractal curves.
- Higher-Order Procedures – procedures taking procedural parameters, then later by writing procedures that return procedures (procedure factories), uncomputability, procedures that make procedures, an application: verifying ID numbers.
- Compound Data and Data Abstraction – uses the game of Nim to introduce data abstraction as a method for dealing with compound data.
- Lists – explains Scheme lists through the two-part list viewpoint, and illustrate them using box-and-pointer diagrams. Construct simple lists, both explicitly and procedurally, and explain and reinforce basic list processing idioms (cdring down a list, consing up a list, map, filter, iteration, and tree recursion) through numerous examples and exercises.
- Trees – binary search trees, efficiency issues with binary search trees, expression trees. The application section develops an automated phone book using the data retrieval radix trees know as tries.
- Generic Operations – multiple representations, and exploiting commonality. The application section illustrates generic operations by having the reader implement a computer graphics system.
- Implementing Programming Languages – writing two different Scheme evaluators (Micro-Scheme and Mini-Scheme) in Scheme using the pattern/action system.
- Computers with Memory – use vectors to program a simulator for our RISC architecture in Scheme.
- Dynamic Programming – shows how storage, in the form of vectors, can be used to dramatically improve the efficiency of algorithms through the closely related techniques of memoization and dynamic programming.
- Object-Based Abstractions – RA-Stack Implementations and Representation Invariants, Queues, Binary Search Trees Revisited, An Application: Dictionaries.
- Object-Oriented Programming – extend object-based programming to true object-oriented programming.
- Java, Applets and Concurrency – shows how the object-oriented programming ideas from the Object-Oriented Programming chapter can be transplanted into another programming language, Java.
3. Simply Scheme: Introducing Computer Science by Brian Harvey, Matthew Wright
This introduction to computer science and computer programming in Scheme is for non-computer science majors with a strong interest in the subject and for computer science majors who lack prior programming experience.
The text allows the student to experience the computer as a tool for expressing ideas, not as a frustrating set of mathematical obstacles. This goal is supported by the use of Scheme, a modern dialect of Lisp, designed to emphasize symbolic programming.
- Introduction – introduces the Scheme programming language. It provides a collection of short Scheme programs, presented to show off what Scheme can do.
- Composition of Functions – explores functions in some detail. This chapter separate she idea of functions from the complexities of programming language notation.
- Functions as Data – looks at higher-order functions, lambda, as well as a tic-tac-toe example.
- Recursion – Introduction to recursion, moves on to build up to a recursive procedure by writing a number of special-case non-recursive procedures, starting with small arguments and working toward larger ones. Later chapters look at recursion in more detail, common patterns in recursive procedures, with an extended example showing off what the reader has been learning to accomplish.
- Abstraction – takes a closer look at two specific kinds of abstraction. One is data abstraction, which means the invention of new data types. The other is the implementation of higher-order functions, an important category of the same process abstraction of which third-person is a trivial example.
- Sequential Programming – input and output, an example: the functions program, files, vectors, a further example: a spreadsheet program.
All books in this series:
|Free Programming Books|
|Ada||ALGOL-like programming language, extended from Pascal and other languages|
|Agda||Dependently typed functional language based on intuitionistic Type Theory|
|Arduino||Inexpensive, flexible, open source microcontroller platform|
|Assembly||As close to writing machine code without writing in pure hexadecimal|
|Awk||Versatile language designed for pattern scanning and processing language|
|Bash||Shell and command language; popular both as a shell and a scripting language|
|BASIC||Beginner’s All-purpose Symbolic Instruction Code|
|C||General-purpose, procedural, portable, high-level language|
|C++||General-purpose, portable, free-form, multi-paradigm language|
|C#||Combines the power and flexibility of C++ with the simplicity of Visual Basic|
|Clojure||Dialect of the Lisp programming language|
|COBOL||Common Business-Oriented Language|
|Coq||Dependently typed language similar to Agda, Idris, F* and others|
|Crystal||General-purpose, concurrent, multi-paradigm, object-oriented language|
|CSS||CSS (Cascading Style Sheets) specifies a web page’s appearance|
|D||General-purpose systems programming language with a C-like syntax|
|Dart||Client-optimized language for fast apps on multiple platforms|
|Dylan||Multi-paradigm language supporting functional and object-oriented coding|
|ECMAScript||Best known as the language embedded in web browsers|
|Eiffel||Object-oriented language designed by Bertrand Meyer|
|Elixir||Relatively new functional language running on the Erlang virtual machine|
|Erlang||General-purpose, concurrent, declarative, functional language|
|F#||Uses functional, imperative, and object-oriented programming methods|
|Factor||Dynamic stack-based programming language|
|Forth||Imperative stack-based programming language|
|Fortran||The first high-level language, using the first compiler|
|Go||Compiled, statically typed programming language|
|Groovy||Powerful, optionally typed and dynamic language|
|Haskell||Standardized, general-purpose, polymorphically, statically typed language|
|HTML||HyperText Markup Language|
|Icon||Wide variety of features for processing and presenting symbolic data|
|J||Array programming language based primarily on APL|
|Java||General-purpose, concurrent, class-based, object-oriented, high-level language|
|Julia||High-level, high-performance language for technical computing|
|Kotlin||More modern version of Java|
|LabVIEW||Designed to enable domain experts to build power systems quickly|
|LaTeX||Professional document preparation system and document markup language|
|Lisp||Unique features - excellent to study programming constructs|
|Logo||Dialect of Lisp that features interactivity, modularity, extensibility|
|Lua||Designed as an embeddable scripting language|
|Markdown||Plain text formatting syntax designed to be easy-to-read and easy-to-write|
|Objective-C||Object-oriented language that adds Smalltalk-style messaging to C|
|OCaml||The main implementation of the Caml language|
|Pascal||Imperative and procedural language designed in the late 1960s|
|Perl||High-level, general-purpose, interpreted, scripting, dynamic language|
|PHP||PHP has been at the helm of the web for many years|
|PostScript||Interpreted, stack-based and Turing complete language|
|Prolog||A general purpose, declarative, logic programming language|
|Python||General-purpose, structured, powerful language|
|QML||Hierarchical declarative language for user interface layout - JSON-like syntax|
|R||De facto standard among statisticians and data analysts|
|Racket||General-purpose, object-oriented, multi-paradigm, functional language|
|Raku||Member of the Perl family of programming languages|
|Ruby||General purpose, scripting, structured, flexible, fully object-oriented language|
|Rust||Ideal for systems, embedded, and other performance critical code|
|Scala||Modern, object-functional, multi-paradigm, Java-based language|
|Scheme||A general-purpose, functional language descended from Lisp and Algol|
|Scratch||Visual programming language designed for 8-16 year-old children|
|SQL||Access and manipulate data held in a relational database management system|
|Standard ML||General-purpose functional language characterized as "Lisp with types"|
|Swift||Powerful and intuitive general-purpose programming language|
|Tcl||Dynamic language based on concepts of Lisp, C, and Unix shells|
|TeX||Markup and programming language - create professional quality typeset text|
|Vala||Object-oriented language, syntactically similar to C#|
|VHDL||Hardware description language used in electronic design automation|
|VimL||Powerful scripting language of the Vim editor|
|XML||Rules for defining semantic tags describing structure ad meaning|